Что такое Celery Beat и какова его роль в Celery?

Ответ

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

Важно понимать, что Celery Beat не выполняет задачи сам, а только инициирует их запуск. Непосредственным исполнением занимаются Celery Workers.

Схема работы: Celery Beat (планировщик) -> Брокер сообщений (очередь) -> Celery Worker (исполнитель)

Основные сценарии использования:

  • Регулярные отчеты: Отправка ежедневных, еженедельных или ежемесячных отчетов.
  • Периодическая синхронизация данных: Обновление информации из внешних API через определенные интервалы.
  • Очистка системы: Удаление временных файлов, устаревших записей в базе данных.
  • Мониторинг: Периодическая проверка состояния сервисов.

Пример конфигурации:

# tasks.py
from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def send_daily_report():
    print("Отправка ежедневного отчета...")
    # ... логика отправки отчета

# Конфигурация расписания для Celery Beat
app.conf.beat_schedule = {
    'send-report-every-morning': {
        'task': 'tasks.send_daily_report', # Путь к задаче
        'schedule': crontab(hour=8, minute=0), # Каждый день в 8:00 утра
    },
}

Запуск Beat и Worker:

Для работы системы необходимо запустить два отдельных процесса:

# 1. Запуск планировщика Celery Beat
celery -A tasks beat --loglevel=info

# 2. Запуск воркера для выполнения задач (в другом терминале)
celery -A tasks worker --loglevel=info

Ответ 18+ 🔞

А, Celery Beat, ну это ж классика, блядь! Представь себе такого занудного будильника, который не пищит, а пихает тебе в очередь сообщений напоминания о том, что пора бы уже что-то сделать. Сам он нихуя не делает, только пинает. А вся работа — это уже на совести воркеров, этих трудяг-исполнителей.

Вот смотри, как это устроено, ёпта: Celery Beat (этот самый пинатель) -> Очередь (куда он пихает) -> Celery Worker (тот, кто реально впахивает)

Зачем это, блядь, вообще нужно? Ну, например:

  • Отчёты, сука, ежедневные. Каждое утро в восемь, чтобы начальник проснулся и сразу увидел, что все работают.
  • Синхронизация какая-нибудь. Раз в час сходить к стороннему сервису, спросить: «Ну чё там у вас новенького?».
  • Уборка мусора. Раз в сутки подмести базу данных, выкинуть старьё, которое уже воняет.
  • Проверка пульса. Пинговать другие сервисы, чтобы не сдохли без ведома.

Вот, смотри, как это в коде выглядит, чих-пых:

# tasks.py
from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def send_daily_report():
    print("Отправка ежедневного отчета...")
    # ... тут вся магия с отчётом

# А вот тут мы этому будильнику на уши вешаем расписание
app.conf.beat_schedule = {
    'send-report-every-morning': {
        'task': 'tasks.send_daily_report', # Какую задачу пинать
        'schedule': crontab(hour=8, minute=0), # Когда пинать: каждый день в 8 утра, блядь
    },
}

И главное, ёперный театр, не забудь запустить обоих! Одного будильника мало, нужен же кто-то, кто будет на эти пинки реагировать.

# Терминал 1: Запускаем самого пинателя, Beat
celery -A tasks beat --loglevel=info

# Терминал 2: Запускаем воркеров, которые будут отдуваться
celery -A tasks worker --loglevel=info

Вот и вся магия. Beat орёт «Пора!», а Worker бежит делать. Просто, как три копейки, но без этого никуда.