Как Celery обеспечивает асинхронное выполнение задач в Python

Ответ

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

Архитектура Celery состоит из трех ключевых компонентов:

  1. Клиент (ваше приложение): Создает и отправляет задачу в очередь.
  2. Брокер сообщений (например, RabbitMQ, Redis): Принимает, хранит и передает задачи воркерам. Это центральный узел системы.
  3. Воркер (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!")

Такой подход позволяет масштабировать обработку задач, запуская множество воркеров, в том числе на разных серверах, и обеспечивает надежность за счет механизмов повторных попыток.