У цій лекції поговоримо про Celery Beat — доповнення до Celery, яке дозволяє зручно створювати та планувати регулярні задачі. Якщо ти хоч раз замислювався, як автоматизувати виконання задач у твоєму застосунку за розкладом — будь то щотижнева відправка листів, видалення застарілих даних або регулярне оновлення звітів — ти потрапив туди, куди треба.
Celery Beat — це інструмент для планування задач в Celery. Він працює як "будильник" для твоїх задач, нагадуючи системі, що час виконати певну задачу у вказаний момент. Наприклад, якщо хочеш запускати задачу кожні 5 хвилин або щопонеділка о 8:00, Celery Beat зробить це без проблем.
Переваги використання Celery Beat
- Простота налаштування розкладу (не потрібно писати складні планувальники).
- Повна інтеграція з Celery, тобто твої задачі вже готові до використання.
- Можливість динамічно змінювати розклад без перезапуску застосунку.
Як це працює?
Celery Beat зберігає розклад виконання задач у базі даних, читає його і відправляє задачі в Celery відповідно до вказаного часу.
Архітектурно це виглядає так:
Celery Beat Scheduler (читаємо розклад з БД) --> Відправляємо задачі в брокер (RabbitMQ/Redis) --> Celery Worker виконує задачі.
Встановлення і налаштування Celery Beat
Перш ніж насолоджуватися магією Celery Beat, його потрібно встановити і налаштувати.
Celery Beat можна встановити командою:
pip install django-celery-beat
Якщо працюєш з FastAPI, підхід той самий. Однак для Django це розширення з коробки адаптоване, тому багато готових фіч працюватимуть без додаткових танців.
- Додаємо застосунок Celery Beat:
Уsettings.pyдодаємоdjango_celery_beatв списокINSTALLED_APPS:INSTALLED_APPS = [ ... 'django_celery_beat', ] - Застосовуємо міграції:
Після додавання застосунку потрібно застосувати міграції. Celery Beat використовує таблиці в базі для збереження розкладу.python manage.py migrate - Налаштовуємо конфігурацію Celery:
У файлcelery.pyтвого проекту додай наступний код:from celery import Celery app = Celery('your_project_name') # Налаштування з settings.py app.config_from_object('django.conf:settings', namespace='CELERY') # Автоматична реєстрація задач app.autodiscover_tasks() # Увімкнення Beat app.conf.beat_scheduler = 'django_celery_beat.schedulers.DatabaseScheduler'Ця настройка активує використання бази даних для збереження розкладу.
- Запуск Celery Beat:
Щоб запустити Celery Beat, використовуй команду:celery -A your_project_name beat --loglevel=infoBeat почне працювати як планувальник, перевіряючи розклад у базі даних.
Налаштування періодичних задач
Тепер, коли Celery Beat налаштований, давай створимо кілька задач, які будуть виконуватися за розкладом.
Приклад задачі у файлі tasks.py:
from celery import shared_task
@shared_task
def my_periodic_task():
print("Це завдання виконується за розкладом!")
Додавання задачі в розклад через Django Admin
- Запусти сервер Django і зайди в адмін-панель.
- У секції "Periodic Tasks" натисни кнопку "Add".
- Заповни наступні поля:
- Name: ім'я задачі (наприклад, "Привітання").
- Task (вибір): обери задачу
my_periodic_taskз випадаючого списку. - Interval: вибери інтервал виконання задачі (наприклад, "Кожну 1 хвилину").
- Натисни "Зберегти".
Готово! Ти тільки-но створив задачу, яка буде виконуватися регулярно.
Приклади налаштування розкладу
Celery Beat підтримує два типи інтервалів для налаштування задач: Interval Schedule і Crontab Schedule.
Interval Schedule використовується, коли хочеш виконувати задачу через певні проміжки часу.
Приклад: задача виконується кожні 10 хвилин.
- У Django Admin зайди в "Interval Schedules".
- Додай новий інтервал:
- Every: 10
- Period: хвилин
- Признач цю інтервал для Periodic Task.
Crontab Schedule — більш гнучкий спосіб, коли треба вказати точний час або дні. Наприклад, "кожен понеділок о 9:00".
Приклад налаштування:
- У Django Admin зайди в "Crontab Schedules".
- Створи новий Crontab:
- Minute: 0
- Hour: 9
- Day of week: 1 (понеділок)
- Month of year: *
- Признач цей Crontab для Periodic Task.
Якщо забув синтаксис Crontab, скористайся crontab.guru — зручним інструментом для тестування розкладу.
Приклади налаштування в FastAPI
Якщо працюєш з FastAPI, то Celery Beat теж можна використовувати. Основний принцип залишається той самий: задачі Celery реєструються і підключаються до планувальника з використанням Crontab або Interval.
Приклад задачі:
from celery import Celery
celery_app = Celery('my_project', broker='redis://localhost')
@celery_app.task
def welcome_task():
print("Привіт від задачі Celery у FastAPI!")
Задачі налаштовуються аналогічно Django — через базу даних. Різниця лише в тому, як інтегрувати інтерфейс (наприклад, через REST).
Моніторинг виконання задач
Для моніторингу виконання задач після їх планування можна використовувати Celery Flower.
Якщо пропустив це в попередніх лекціях, невелике нагадування:
Встанови Flower через pip:
pip install flower
Запусти Flower для твого проєкту:
celery -A your_project_name flower --port=5555
Flower дає веб-інтерфейс, де можна відслідковувати виконання задач і їх статус.
Практичні приклади планування задач
1. Видалення старих даних з бази
@shared_task
def delete_old_entries():
from my_app.models import MyModel
MyModel.objects.filter(created_at__lt=datetime.now()-timedelta(days=30)).delete()
Налаштуй Crontab для щотижневого виконання цього завдання.
2. Відправка щомісячних звітів
@shared_task
def send_monthly_report():
print("Щомісячний звіт відправлено!")
Налаштуй Crontab для виконання у перший день кожного місяця.
Minute: 0
Hour: 9
Day of month: 1
3. Оновлення даних з API
@shared_task
def update_data_from_api():
# Логіка оновлення з API
print("Дані успішно оновлено!")
Налаштуй Interval Schedule для виконання кожні 12 годин.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ