Sobes.tech
Назад к вопросам
Junior — Middle
61

В каком процессе запускается задача Celery?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Задача Celery выполняется не в процессе веб-приложения, а в отдельном worker-процессе. В какой именно процесс попадёт задача, зависит от пула исполнения worker’а и его конфигурации. Обычно важно понимать, что отправка задачи и её выполнение разделены.

Определение:

Celery-задача запускается асинхронно в процессе воркера Celery, который читает задания из брокера сообщений. Само приложение только публикует задачу в очередь, а worker забирает её и выполняет отдельно от основного сервера. Это позволяет не блокировать HTTP-запросы и масштабировать обработку.

Пример использования:

Например, после регистрации пользователя нужно отправить приветственное письмо, но делать это в рамках HTTP-ответа долго. В этом случае приложение ставит задачу в Celery, а отдельный worker потом выполняет отправку письма.

from celery import Celery

app = Celery(
    "tasks",
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/1",
)

@app.task
def send_welcome_email(user_email):
    print(f"Sending email to {user_email}")
send_welcome_email.delay("user@example.com")

Пояснение кода:

  1. Создаётся объект Celery с настройками брокера и backend’а.
  2. Функция помечается декоратором @app.task, после чего становится Celery-задачей.
  3. Вызов delay(...) не выполняет функцию сразу, а отправляет сообщение в очередь.
  4. Отдельный celery worker получает это сообщение и запускает send_welcome_email в своём процессе.

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

  • Задача Celery не выполняется в процессе Django/Flask/другого веб-сервера.
  • Выполнение происходит в отдельном процессе worker’а Celery.
  • Задача сначала попадает в брокер сообщений, а потом забирается worker’ом.
  • Конкретный процесс зависит от пула воркера и его настроек.
  • Такой подход нужен для асинхронной и фоновой обработки без блокировки основного приложения.