Что такое Celery и для чего он используется?python-43

Celery — это асинхронный распределенный механизм очередей задач, который позволяет выносить фоновые задачи за пределы основного потока выполнения приложения.

Основные концепции

  1. Task (Задача) - единица работы, которая выполняется асинхронно
  2. Broker (Брокер) - посредник для передачи сообщений (RabbitMQ, Redis)
  3. Worker (Воркер) - процесс, выполняющий задачи
  4. Backend (Бэкенд) - хранилище результатов (Redis, Django ORM и др.)

Типичные сценарии использования

  1. Фоновые задачи:

    • Обработка изображений/видео
    • Отправка email/SMS
    • Генерация отчетов
  2. Планировщик задач:

    • Ежедневные отчеты
    • Периодическое обновление данных
  3. Распределенные вычисления:

    • Параллельная обработка данных
    • Массовые операции

Базовый пример

from celery import Celery

# Инициализация Celery
app = Celery(
    'tasks',
    broker='pyamqp://guest@localhost//',
    backend='rpc://'
)

# Определение задачи
@app.task
def add(x, y):
    return x + y

# Запуск задачи асинхронно
result = add.delay(4, 4)
print(result.get())  # Получаем результат (8)

Компоненты системы

  1. Клиент (Client):

    • Отправляет задачи в брокер
    result = task.delay(args)
    
  2. Воркер (Worker):

    • Запускается командой:
    celery -A tasks worker --loglevel=INFO
    
  3. Цветы (Flower) - мониторинг задач:

    celery -A tasks flower
    

Продвинутые возможности

Цепочки задач

from celery import chain

# Задачи выполняются последовательно
chain(add.s(2, 2), add.s(4), add.s(8))()

Группы задач

from celery import group

# Параллельное выполнение
group(add.s(i, i) for i in range(10))()

Планирование

from celery.schedules import crontab

app.conf.beat_schedule = {
    'every-monday-morning': {
        'task': 'tasks.send_weekly_report',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
    },
}

Интеграция с Django

  1. Установка:

    pip install celery django-celery-results
    
  2. Настройка в settings.py:

    CELERY_BROKER_URL = 'redis://localhost:6379/0'
    CELERY_RESULT_BACKEND = 'django-db'
    
  3. Создание задачи:

    from celery import shared_task
    
    @shared_task
    def send_email_task(user_id):
        user = User.objects.get(id=user_id)
        user.email_user("Subject", "Message")
    

Мониторинг и администрирование

  1. Flower - веб-интерфейс для мониторинга
  2. celery inspect - CLI для проверки воркеров
    celery -A proj inspect active
    
  3. celery events - мониторинг событий в реальном времени

Ограничения

  1. Требует отдельного сервиса брокера (Redis/RabbitMQ)
  2. Накладные расходы на сериализацию задач
  3. Сложность отладки распределенных задач

Альтернативы

  1. RQ (Redis Queue) - более простая альтернатива
  2. Dramatiq - современная замена Celery
  3. Huey - легковесная очередь задач

Резюмируем

Celery — это мощный инструмент для управления фоновыми задачами в Python-приложениях, особенно полезный в веб-разработке (Django/Flask) и data processing pipelines. Он обеспечивает надежное выполнение задач, масштабируемость и гибкое планирование, но требует настройки инфраструктуры (брокер сообщений и воркеры).