В предыдущей статье мы изучили Django-Celery-Beat: Как создавать задачи по расписанию, где рассмотрели основной способ создания задач по расписанию в Django-Celery-Beat.

📌 Щелкните по заголовку, чтобы также ознакомиться с предыдущим постом!

Однако в реальных проектах просто периодическое выполнение в заданное время часто оказывается недостаточным.

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

Чтобы справиться с такой сложной логикой, в этой статье мы более подробно рассмотрим модель PeriodicTask в Django-Celery-Beat и различные поля и способы их настройки! 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ Настройка PeriodicTask с использованием update_or_create

В реальных службах чаще изменяют уже созданные задачи в соответствии с запросами пользователей и изменениями в среде, чем оставляют их без изменений.

Поэтому, PeriodicTask.objects.create() лучше заменить на update_or_create() метод, который будет более полезным.

📌 Используя update_or_create(),

  1. если задача уже существует, она будет обновлена
  2. если не существует, будет создана новая

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

2️⃣ Поле PeriodicTask.interval и модель IntervalSchedule

Модель PeriodicTask в Django-Celery-Beat позволяет настраивать интервалы повторного выполнения через поле interval.

Это interval поле связано с моделью IntervalSchedule, поэтому необходимо сначала создать экземпляр IntervalSchedule, а затем ссылаться на него в PeriodicTask.

То есть, чтобы зарегистрировать задачу по расписанию:

  1. Сначала создайте экземпляр IntervalSchedule
  2. Затем свяжите созданный IntervalSchedule с PeriodicTask

3️⃣ Опции полей IntervalSchedule

Имя поля Описание Пример значений
every Числовое значение повторного интервала 10, 30, 2
period Единица повторного интервала IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ Пример настройки PeriodicTask с использованием update_or_create

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# Создание IntervalSchedule (каждые 10 минут)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# Создание или обновление PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
    name="send_reminder_email",
    defaults={
        "interval": schedule,
        "task": "myapp.tasks.send_reminder_email",
        "args": json.dumps([1]),
        "enabled": True,
    }
)

5️⃣ Описание других полей PeriodicTask

Имя поля Описание Пример
name Уникальное имя задачи "send_report_task"
interval Интервал выполнения (ссылка на IntervalSchedule) schedule
crontab В случае выполнения в определенное время (ссылка на CrontabSchedule) None
clocked Выполняется только один раз в определенное время (ссылка на ClockedSchedule) None
task Задача Celery для выполнения "myapp.tasks.send_report"
args Аргументы для функции (в формате JSON) json.dumps([123, "email@example.com"])
kwargs Ключевые аргументы для функции (в формате JSON) json.dumps({"priority": "high"})
enabled Статус выполнения True или False
one_off Выполняется только один раз и завершает работу True или False

📌 Установив значение one_off=True, задача будет деактивирована после первого выполнения, но не будет удалена.

📌 Используя поле clocked, можно запланировать задачу, которая будет выполнена только один раз в точное определенное время.

🎯 Заключение: Для гибкого управления запланированными задачами используйте update_or_create!

📌 Используя update_or_create() для регистрации запланированных задач в Django-Celery-Beat, вы можете легко изменять существующие задачи.

📌 Поле PeriodicTask.interval ссылается на IntervalSchedule, его необходимо создать до подключения.

📌 Для управления сложными запланированными задачами можно использовать поля args, kwargs, enabled, one_off, clocked, что позволяет гибко настраивать задачи.

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

В этой статье мы узнали, как добавить гибкость в создание и изменение PeriodicTask.

В следующей статье мы рассмотрим настройку задач по расписанию с использованием Crontab для выполнения в заданное время и Clocked для выполнения задачи один раз в строго определенное время.

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

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

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