В предыдущем посте мы рассмотрели, как управлять запланированными задачами с использованием IntervalSchedule через Django-Celery-Beat: Практический пример запланированных задач с использованием PeriodicTask.

Однако в реальных проектах метода повторного выполнения (interval) часто бывает недостаточно.

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

В таких случаях использование методов Crontab или Clocked позволяет задавать более точные запланированные задачи. 🚀

📌 Не знакомы с концепцией Crontab?

➡️ Понимание `crontab` в Linux: лучшие советы по автоматическому планированию

Если вы сначала прочитаете вышеуказанную статью, вам будет легче понять! 😊

Django Celery-Beat task scheduling with Crontab and Clocked

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"`! 🚀 😊