В предыдущем посте мы рассмотрели, как управлять запланированными задачами с использованием IntervalSchedule через Django-Celery-Beat: Практический пример запланированных задач с использованием PeriodicTask.
Однако в реальных проектах метода повторного выполнения (interval) часто бывает недостаточно.
- Когда нужно запустить задачу в определенное время каждый день
- Когда требуется выполнить задачу один раз в конкретную дату и время
В таких случаях использование методов Crontab или Clocked позволяет задавать более точные запланированные задачи. 🚀
📌 Не знакомы с концепцией Crontab?
➡️ Понимание `crontab` в Linux: лучшие советы по автоматическому планированию
Если вы сначала прочитаете вышеуказанную статью, вам будет легче понять! 😊
1️⃣ Запланированное выполнение в определенное время с использованием `CrontabSchedule`
Crontab – это способ планирования задач в Linux, который позволяет настраивать выполнение в конкретное время (секунды/минуты/часы/дни недели/даты).
В Django-Celery-Beat также можно использовать `CrontabSchedule` для настройки запланированных задач тем же способом.
📌 Пример: Запланированная задача, выполняемая каждый день в 9:30 утра
from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json
# 1️⃣ Создание CrontabSchedule (выполняется каждый день в 09:30)
schedule, created = CrontabSchedule.objects.get_or_create(
minute="30",
hour="9",
day_of_week="*",
day_of_month="*",
month_of_year="*"
)
# 2️⃣ Создание или обновление PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
name="daily_report_task",
defaults={
"crontab": schedule, # Применение CrontabSchedule
"task": "myapp.tasks.generate_daily_report",
"args": json.dumps([]),
"enabled": True,
}
)
✅ Вышеуказанная настройка запланирована на выполнение каждый день в 9:30 утра! 🎯
✅ Описание полей `CrontabSchedule`
Название поля | Описание | Пример |
---|---|---|
`minute` | Установка минут для выполнения | "0", "30", "*/10" |
`hour` | Установка часов для выполнения | "0", "9", "*/6" |
`day_of_week` | Установка дней недели для выполнения (0=Воскресенье) | "*" (каждый день), `"1,3,5"` (Пн/Ср/Пт) |
`day_of_month` | Установка даты для выполнения | "*" (каждый день), `"1,15"` (1 и 15 число каждого месяца) |
`month_of_year` | Установка месяца для выполнения | "*" (каждый месяц), `"1,6,12"` (Январь, Июнь, Декабрь) |
2️⃣ Запуск задачи один раз в определенное время с использованием `ClockedSchedule`
`ClockedSchedule` используется для настройки запланированных задач, которые выполняются только один раз в конкретную дату и время.
📌 Пример: Запланированная задача, выполняемая один раз в определенную дату (10 февраля 2025 года в 15:00)
from django_celery_beat.models import PeriodicTask, ClockedSchedule
import json
from datetime import datetime
# 1️⃣ Создание ClockedSchedule (выполняется 10 февраля 2025 года в 15:00)
scheduled_time = datetime(2025, 2, 10, 15, 0) # Обязательно используйте объект datetime!
schedule, created = ClockedSchedule.objects.get_or_create(
clocked_time=scheduled_time
)
# 2️⃣ Создание PeriodicTask (установить one_off=True!)
task, created = PeriodicTask.objects.update_or_create(
name="one_time_task_20250210",
defaults={
"clocked": schedule, # Применение ClockedSchedule
"task": "myapp.tasks.one_time_email",
"args": json.dumps([]),
"enabled": True,
"one_off": True, # Автоматическая деактивация после выполнения
}
)
✅ Данная настройка будет выполнена один раз 10 февраля 2025 года в 15:00 и автоматически деактивируется.
- 📌 При создании экземпляра модели ClockedSchedule поле
clocked_time
должно быть обязательно введено как объектdatetime
. - 📌 Использование строк или других типов данных может привести к ошибкам.
📌 Связь между ClockedSchedule и опцией one_off?
При создании задачи, которая выполняется один раз с использованием ClockedSchedule
, вы устанавливаете one_off=True
,
и вас может интересовать, как эта настройка взаимодействует с полем enabled
.
📌 Хотите узнать больше о связи между двумя полями (clocked_time
и one_off
)?
➡️ Связь one-off и enabled в Celery Beat: правильное понимание и использование
В статье рассматривается, как точно работает `one_off=True`, а также различия с `enabled`, так что ознакомьтесь! 😊
🎯 Заключение: Используя Crontab
и Clocked
, вы можете настроить более точные запланированные задачи!
- Используя CrontabSchedule, вы можете планировать задачи, которые выполняются периодически, но в определенное время!
- Используя ClockedSchedule, вы можете планировать задачи, которые выполняются только один раз в конкретный момент времени!
- Поле
clocked_time
при создании ClockedSchedule должно быть обязательно введено как объектdatetime
! - Связь между
ClockedSchedule
и настройкойone_off=True
будет более подробно рассмотрена в следующей публикации!
Если вы хотите узнать больше о более глубоком использовании Celery,
Ищите в списке ниже 'схожие посты' или воспользуйтесь строкой поиска в правом верхнем углу с запросом `"Celery"`! 🚀 😊
댓글이 없습니다.