При создании веб-приложения вы часто сталкиваетесь с необходимостью выполнения долговременных задач. Например:

  • Когда пользователь регистрируется, необходимо отправить подтверждающее письмо.
  • Каждую ночь в 12 часов автоматически выполнять задачу по очистке данных.
  • Когда пользователь запрашивает выполнение определенной задачи, она должна быть выполнена в установленное время.

Django по умолчанию работает в режиме немедленного ответа на запрос, поэтому нам нужно найти способ асинхронной обработки долгих задач. И вот здесь на помощь приходит Celery! 🚀

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

Иллюстрация планирования задач Django Celery-Beat

1️⃣ Как настроить запланированные задачи в Django-Celery-Beat

Существует два основных способа настройки запланированных задач в Celery-Beat.

✅ (1) Настройка через GUI в Django Admin

Django-Celery-Beat поддерживает настройку запланированных задач через GUI в Django Admin.

📌 Особенности
  • Без кода вы можете настроить периодические задачи всего за несколько шагов.
  • В административной панели Django можно устанавливать и изменять периодические задачи через UI.
  • Тем не менее, это статическая настройка, поэтому неудобно изменять ее динамически в зависимости от пользовательских запросов.
📌 Когда это будет полезно?
  • Когда не требуется взаимодействие между приложением и пользователем
  • Например: автоматически выполнять резервную копию данных каждый день в полночь
  • Например: обновлять данные API каждое понедельник утром

✅ (2) Динамическое создание запланированных задач через Python-код

Вы можете прямо в коде создавать запланированные задачи Celery-Beat.

📌 Особенности
  • Можно динамически создавать запланированные задачи в зависимости от запросов пользователей.
  • Запланированные задачи можно создавать, изменять и удалять через код.
  • Без обращения к админ-панели, можно зарегистрировать периодические задачи напрямую из представления.
📌 Когда это будет полезно?
  • Когда требуется запланированная задача по определенному запросу пользователя.
  • Например: пользователь "заказывает заранее" и регистрация задачи, которая автоматически отменяется через 2 часа.
  • Например: если пользователь устанавливает функцию "Напоминание по электронной почте", настройка получения напоминаний по электронной почте в установленное время.

2️⃣ [Практика] Создание запланированной задачи с помощью Python-кода

Шаг 1: Определение задачи Celery

from celery import shared_task

@shared_task
def send_reminder_email(user_id):
    # Логика отправки письма реализуется здесь
    print(f"📧 Напоминание отправлено пользователю {user_id}!")

Шаг 2: Создание объекта PeriodicTask в Django-Celery-Beat

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# 1️⃣ Создание интервала выполнения (например: каждые 10 минут)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,  # Каждые 10 минут
    period=IntervalSchedule.MINUTES
)

# 2️⃣ Создание PeriodicTask
task = PeriodicTask.objects.create(
    interval=schedule,  # Интервал выполнения
    name="Отправить напоминание по электронной почте",  # Имя задачи
    task="myapp.tasks.send_reminder_email",  # Имя Celery Task для выполнения
    args=json.dumps([1]),  # Передача ID пользователя (пример - пользователь 1)
)

🎯 Заключение: Celery необходим разработчикам Django!

Celery — это незаменимый инструмент для управления асинхронными задачами и их планирования в Django.

Особенно используя Celery-Beat, вы можете настраивать периодические задачи и динамически управлять расписанием в зависимости от определенных событий.

📌 Итак, в кратце:

  1. Django-Celery-Beat — это мощный инструмент для выполнения запланированных задач.
  2. С помощью Django Admin (GUI) легко настраивать периодические задачи.
  3. Создавая задачи через Python-код, вы можете динамически управлять запланированными задачами в зависимости от запросов пользователей.
  4. Если вы разработчик Django, это обязательно ознакомиться с основными концепциями Celery и Celery-Beat!

🔥 Анонс следующего выпуска

В этом выпуске мы кратко рассмотрели создание запланированных задач Celery-Beat с помощью кода. Однако на практике вы будете использовать более разнообразные поля модели `PeriodicTask` для работы с более сложной логикой.

В следующем выпуске мы подробно рассмотрим как планировать различные задачи и какую роль играют каждое поле модели `PeriodicTask`.

Если вы хотите узнать больше о глубоких возможностях использования Celery, не пропустите следующий выпуск! 🚀

И если вы хотите увидеть больше статей о Celery в блоге,

поиск по списку ниже 'Похожие посты' или в строке поиска в правом верхнем углу по запросу "Celery"! 😊