Ответ
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 бежит делать. Просто, как три копейки, но без этого никуда.