Для каких задач используется Celery и как запустить простую задачу

«Для каких задач используется Celery и как запустить простую задачу» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Celery — это распределенная очередь задач для Python. Её основная цель — выполнение длительных или ресурсоемких операций асинхронно, чтобы не блокировать основной поток приложения (например, веб-сервера).

Основные сценарии использования:

  • Отправка email или push-уведомлений.
  • Обработка изображений или видео (создание превью, конвертация).
  • Выполнение периодических задач по расписанию (Celery Beat).
  • Взаимодействие с медленными внешними API.

Пример: Запуск простой задачи сложения

1. Установка зависимостей

В качестве брокера сообщений будем использовать Redis.

pip install celery redis

2. Определение задачи (tasks.py)

from celery import Celery
import time

# Инициализация Celery с указанием имени приложения и URL брокера
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
    """Простая задача, которая складывает два числа."""
    time.sleep(5) # Имитация долгой операции
    return x + y

3. Запуск worker'а

Worker — это процесс, который слушает очередь и выполняет задачи по мере их поступления. Запускается из терминала:

celery -A tasks worker --loglevel=info

4. Вызов задачи из другого скрипта

from tasks import add

# .delay() ставит задачу в очередь и немедленно возвращает объект AsyncResult
result = add.delay(4, 6)

print(f"Задача {result.id} отправлена в очередь.")

# Чтобы дождаться и получить результат (блокирующая операция):
# final_result = result.get(timeout=10)
# print(f"Результат: {final_result}")

Ключевые компоненты:

  • Task: Функция, декорированная @app.task.
  • Broker (Брокер): Посредник (Redis, RabbitMQ), который хранит задачи в очереди.
  • Worker (Воркер): Процесс, который забирает задачи из очереди и выполняет их.
  • Backend (Бэкенд): Опциональное хранилище для результатов выполнения задач.