В предыдущей статье мы изучили Django-Celery-Beat: Как создавать задачи по расписанию, где рассмотрели основной способ создания задач по расписанию в Django-Celery-Beat.
📌 Щелкните по заголовку, чтобы также ознакомиться с предыдущим постом!
Однако в реальных проектах просто периодическое выполнение в заданное время часто оказывается недостаточным.
- Возможно, потребуются ограничения по времени выполнения,
- или необходимо будет динамически изменять период выполнения,
- или отключать задачу при соблюдении определенных условий,
- или обеспечить автоматическую отмену запланированных задач после определенной даты.
Чтобы справиться с такой сложной логикой, в этой статье мы более подробно рассмотрим модель PeriodicTask в Django-Celery-Beat и различные поля и способы их настройки! 🚀
1️⃣ Настройка PeriodicTask с использованием update_or_create
В реальных службах чаще изменяют уже созданные задачи в соответствии с запросами пользователей и изменениями в среде, чем оставляют их без изменений.
Поэтому, PeriodicTask.objects.create()
лучше заменить на update_or_create()
метод, который будет более полезным.
📌 Используя update_or_create()
,
- если задача уже существует, она будет обновлена
- если не существует, будет создана новая
Таким образом, возможность перезаписи одной и той же задачи по расписанию позволяет избежать лишних дублирующих экземпляров.
2️⃣ Поле PeriodicTask.interval и модель IntervalSchedule
Модель PeriodicTask
в Django-Celery-Beat позволяет настраивать интервалы повторного выполнения через поле interval
.
Это interval
поле связано с моделью IntervalSchedule
, поэтому необходимо сначала создать экземпляр IntervalSchedule
, а затем ссылаться на него в PeriodicTask
.
То есть, чтобы зарегистрировать задачу по расписанию:
- Сначала создайте экземпляр
IntervalSchedule
- Затем свяжите созданный
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" в верхнем правом углу! 😊
댓글이 없습니다.