Dans un précédent article, nous avons exploré comment gérer les tâches planifiées avec IntervalSchedule à travers un exemple pratique en utilisant Django-Celery-Beat : Exemple pratique de tâches planifiées avec PeriodicTask.

Cependant, dans les projets réels, le simple mode d'exécution répétée (interval) est souvent insuffisant.

  • Lorsque des tâches doivent être exécutées à des moments précis chaque jour
  • Lorsque des tâches doivent être exécutées une seule fois à une date et une heure spécifiques

Dans ces cas, l'utilisation de la méthode de réservation Crontab ou Clocked permet d'établir des tâches planifiées plus précises. 🚀

📌 Vous n’êtes pas familier avec le concept de Crontab ?

➡️ Comprendre correctement le `crontab` sous Linux : conseils automatiques que les développeurs adorent

Lire cet article au préalable facilitera votre compréhension ! 😊

Django Celery-Beat task scheduling with Crontab and Clocked

1️⃣ Réservation à des moments spécifiques avec `CrontabSchedule`

Crontab est une méthode de planification utilisée sous Linux, ce qui permet de configurer l'exécution à des moments précis tels que secondes/minutes/heures/jours de la semaine/jours du mois.

Dans Django-Celery-Beat, vous pouvez également configurer des tâches planifiées en utilisant `CrontabSchedule` de la même manière.

📌 Exemple : tâche planifiée exécutée tous les jours à 9h30

from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json

# 1️⃣ CrontabSchedule création (exécution quotidienne à 09h30)
schedule, created = CrontabSchedule.objects.get_or_create(
    minute="30",
    hour="9",
    day_of_week="*",
    day_of_month="*",
    month_of_year="*"
)

# 2️⃣ Création ou mise à jour de PeriodicTask
task, created = PeriodicTask.objects.update_or_create(
    name="daily_report_task",
    defaults={
        "crontab": schedule,  # Application de CrontabSchedule
        "task": "myapp.tasks.generate_daily_report",
        "args": json.dumps([]),
        "enabled": True,
    }
)

✅ Cette configuration est réservée pour être exécutée tous les jours à 9h30 ! 🎯

✅ Description des champs de `CrontabSchedule`

Nom du champ Description Exemple
`minute` Réglage des minutes d'exécution "0", "30", "*/10"
`hour` Réglage des heures d'exécution "0", "9", "*/6"
`day_of_week` Réglage des jours (0=dimanche) "*"(tous les jours), `"1,3,5"`(lun/mer/ven)
`day_of_month` Réglage des dates d'exécution "*"(tous les jours), `"1,15"`(1er et 15 de chaque mois)
`month_of_year` Réglage des mois d'exécution "*"(chaque mois), `"1,6,12"`(janv., juin, déc.)

2️⃣ Exécution unique à un moment précis avec `ClockedSchedule`

`ClockedSchedule` est utilisé pour définir des tâches planifiées qui s'exécutent une seule fois à une date et une heure spécifiques.

📌 Exemple : tâche exécutée une seule fois à une date spécifique (10 février 2025 à 15h00)

from django_celery_beat.models import PeriodicTask, ClockedSchedule
import json
from datetime import datetime

# 1️⃣ Création de ClockedSchedule (exécution le 10 février 2025 à 15h00)
scheduled_time = datetime(2025, 2, 10, 15, 0)  # Utilisation obligatoire de l'objet datetime!
schedule, created = ClockedSchedule.objects.get_or_create(
    clocked_time=scheduled_time
)

# 2️⃣ Création de PeriodicTask (définir one_off=True!)
task, created = PeriodicTask.objects.update_or_create(
    name="one_time_task_20250210",
    defaults={
        "clocked": schedule,  # Application de ClockedSchedule
        "task": "myapp.tasks.one_time_email",
        "args": json.dumps([]),
        "enabled": True,
        "one_off": True,  # Désactivation automatique après exécution
    }
)

✅ Cette configuration est exécutée une seule fois le 10 février 2025 à 15h00 et sera ensuite désactivée automatiquement.

  • 📌 Lorsque vous créez une instance du modèle ClockedSchedule, le champ clocked_time doit obligatoirement être un objet datetime.
  • 📌 Utiliser des chaînes de caractères ou d'autres types de données peut provoquer des erreurs.

📌 Quelle est la relation entre ClockedSchedule et l'option one_off ?

Lorsque vous créez une tâche qui s'exécute une seule fois dans ClockedSchedule, vous devez définir one_off=True,
vous pourriez vous interroger sur son interaction avec le champ enabled.

📌 Souhaitez-vous en savoir plus sur la relation entre ces deux champs (clocked_time et one_off) ?

➡️ Relation entre one-off et enabled dans Celery Beat : Compréhension correcte et utilisation

Dans cet article, découvrez comment one_off=True fonctionne exactement et quelles sont les différences avec enabled ! 😊

🎯 Conclusion : Crontab et Clocked permettent de réaliser des tâches planifiées plus élaborées !

  • CrontabSchedule permet de planifier des tâches répétitives à des moments précis !
  • ClockedSchedule permet de planifier des tâches qui s'exécutent une seule fois à un moment précis !
  • Lors de la création de ClockedSchedule, le champ clocked_time doit être un objet datetime !
  • La relation entre ClockedSchedule et la définition one_off=True est traitée plus en profondeur dans un article séparé !

Si vous souhaitez en savoir plus sur l'utilisation approfondie de Celery,

consultez la liste des 'articles similaires' ci-dessous ou recherchez "Celery" dans la barre de recherche en haut à droite ! 🚀 😊