Ответ
Celery — это мощная, распределенная очередь задач для Python, предназначенная для выполнения операций асинхронно, вне основного потока приложения (например, веб-сервера).
Архитектура Celery состоит из:
- Клиент (Client): Ваше приложение, которое создает и отправляет задачи в очередь.
- Брокер сообщений (Message Broker): Система вроде RabbitMQ или Redis, которая принимает задачи от клиента и хранит их до тех пор, пока worker не будет готов их обработать.
- Исполнитель (Worker): Процесс, который забирает задачи из очереди и выполняет их.
- Бэкенд результатов (Result Backend): Опциональное хранилище (например, Redis, база данных) для сохранения результатов выполнения задач.
Основные сценарии использования:
- Выполнение долгих операций в фоне: Чтобы не блокировать HTTP-запрос пользователя (например, обработка видео, генерация отчетов, отправка email-рассылки).
- Отложенные задачи: Выполнение задачи в определенное время в будущем (
task.apply_async(countdown=60)). - Периодические задачи (Crontab): Регулярное выполнение задач по расписанию с помощью
Celery Beat(например, ежедневный сбор статистики).
Пример:
from celery import Celery
import time
# Инициализация Celery с указанием брокера (Redis)
app = Celery('tasks', broker='redis://localhost:6379/0')
# Декоратор @app.task превращает функцию в задачу Celery
@app.task
def send_confirmation_email(user_id):
"""Имитация долгой задачи по отправке письма."""
print(f"Начинаем отправку письма пользователю {user_id}...")
time.sleep(10) # Имитация сетевой задержки
print(f"Письмо для пользователя {user_id} успешно отправлено.")
return True
# В коде вашего веб-приложения задача вызывается асинхронно:
# Метод .delay() - это сокращение для .apply_async()
# Он немедленно возвращает управление, а задача выполняется в фоне worker'ом.
# send_confirmation_email.delay(123)