Ответ
Celery выполняет задачи асинхронно в отдельных фоновых процессах, называемых воркерами, что позволяет основному приложению (например, веб-серверу) не блокироваться на время выполнения длительных операций.
Архитектура Celery состоит из трех ключевых компонентов:
- Клиент (ваше приложение): Создает и отправляет задачу в очередь.
- Брокер сообщений (например, RabbitMQ, Redis): Принимает, хранит и передает задачи воркерам. Это центральный узел системы.
- Воркер (Worker): Отдельный процесс, который забирает задачи из очереди, выполняет их и (опционально) сохраняет результат в бэкенд.
Пример задачи:
# tasks.py
from celery import Celery
import time
# Инициализация Celery с указанием брокера
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email(to, content):
print(f"Отправка письма для {to}...")
time.sleep(5) # Имитация длительной операции
print("Письмо отправлено.")
return f"Email to {to} sent successfully."
Запуск воркера из терминала:
celery -A tasks worker --loglevel=info
Вызов задачи из приложения:
from tasks import send_email
# Задача немедленно отправляется в очередь,
# а выполнение кода продолжается без ожидания.
send_email.delay("user@example.com", "Hello, World!")
Такой подход позволяет масштабировать обработку задач, запуская множество воркеров, в том числе на разных серверах, и обеспечивает надежность за счет механизмов повторных попыток.