PRO

Что такое Celery beat? Как запустить периодическую задачу?

Celery beat — планировщик периодических задач для Celery. Он не выполняет задачи сам, а по расписанию добавляет их в очередь; отдельные исполнители Celery получают и выполняют эти задачи.
Подробный ответ

Что такое Celery beat

Celery beat — отдельный процесс-планировщик. Он работает по заданному расписанию и ставит задачи в брокер сообщений. Затем их забирают обычные исполнители Celery.

Celery beat
  |
  | добавляет задачу по расписанию
  v
Брокер сообщений
  |
  v
Исполнитель Celery
  |
  v
Выполнение задачи

Пример задачи

from celery import shared_task


@shared_task
def cleanup_expired_tokens() -> None:
    delete_expired_tokens()

Расписание через интервал

from datetime import timedelta


app.conf.beat_schedule = {
    'cleanup-expired-tokens-every-hour': {
        'task': 'app.tasks.cleanup_expired_tokens',
        'schedule': timedelta(hours=1),
    },
}

Расписание в формате cron

from celery.schedules import crontab


app.conf.beat_schedule = {
    'daily-report-at-two-am': {
        'task': 'app.tasks.create_daily_report',
        'schedule': crontab(hour=2, minute=0),
    },
}

Запуск

celery -A config worker -l info
celery -A config beat -l info

Исполнитель и планировщик обычно запускаются отдельными процессами. Запуск beat вместе с исполнителем через флаг -B может быть удобен локально, но для production лучше разделять эти процессы.

Важные правила

  • задачи по расписанию должны быть идемпотентными, потому что возможны повторные запуски;

  • не следует запускать несколько независимых экземпляров beat с одним расписанием: это может создать дубликаты задач;

  • долгие задачи стоит направлять в отдельную очередь, чтобы они не блокировали срочные задачи;

  • нужно контролировать время выполнения задачи: следующий запуск не должен создавать опасное пересечение с предыдущим.

Как ответить на собеседовании

Celery beat — это планировщик, который по расписанию ставит задачи в очередь, а исполнители Celery выполняют их отдельно. Расписание задаю через интервал или crontab, запускаю beat отдельным процессом и слежу, чтобы в production был один активный планировщик для одного набора расписаний.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге