Dans l'épisode précédent, nous avons appris la méthode fondamentale pour créer des tâches programmées dans Django-Celery-Beat via Django-Celery-Beat : Comment créer des tâches programmées.

📌 Cliquez sur le titre pour consulter le précédent post !

Cependant, dans des projets réels, il n'est souvent pas suffisant de faire exécuter la tâche à intervalles réguliers.

  • Il peut être nécessaire de restreindre l'exécution à des moments spécifiques,
  • ou de changer dynamiquement la fréquence d'exécution,
  • d'inactiver une tâche sous certaines conditions,
  • ou de configurer l'annulation automatique de la réservation après une certaine date.

Pour faire face à ces logiques complexes, cet épisode se concentrera sur l'approfondissement du modèle PeriodicTask de Django-Celery-Beat, ainsi que l'examen de divers champs et méthodes de configuration ! 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ Configuration de PeriodicTask avec update_or_create

Dans le service réel, il est souvent plus fréquent de modifier une tâche réservée que de la laisser telle quelle après sa création.

Par conséquent, utiliser la méthode update_or_create() est généralement plus avantageux que d'utiliser PeriodicTask.objects.create().

📌 En utilisant update_or_create(),

  1. si la tâche existe déjà, elle sera mise à jour
  2. si elle n'existe pas, elle sera créée

Cela signifie que vu qu'il est possible de remplacer une tâche programmée existante par le même nom, cela peut prévenir les instances redondantes inutiles.

2️⃣ Champ PeriodicTask.interval et modèle IntervalSchedule

Le PeriodicTask de Django-Celery-Beat permet de configurer l'intervalle d'exécution répétée via le champ interval.

Ce champ interval est lié au modèle IntervalSchedule, donc il faut d'abord créer une instance IntervalSchedule avant de l'utiliser dans le PeriodicTask.

En d'autres termes, pour enregistrer une tâche programmée :

  1. D'abord, créer une instance IntervalSchedule
  2. Ensuite, connecter le IntervalSchedule créé à PeriodicTask

3️⃣ Options du champ IntervalSchedule

Nom du champ Description Exemples de valeurs
every Valeur numérique du cycle de répétition 10, 30, 2
period Unité du cycle de répétition IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ Exemple de configuration de PeriodicTask utilisant update_or_create

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# Création de l'IntervalSchedule (exécute toutes les 10 minutes)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# Création ou mise à jour de 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️⃣ Description d'autres champs de PeriodicTask

Nom du champ Description Exemple
name Nom unique de la tâche "send_report_task"
interval Intervalle d'exécution (IntervalSchedule réf) schedule
crontab Pour exécuter à des moments spécifiques (CrontabSchedule réf) None
clocked Exécuter une fois à un moment spécifique (ClockedSchedule réf) None
task Tâche Celery à exécuter "myapp.tasks.send_report"
args Arguments à passer à la fonction (JSON format) json.dumps([123, "email@example.com"])
kwargs Arguments clés à passer à la fonction (JSON format) json.dumps({"priority": "high"})
enabled Statut d'exécution True ou False
one_off Exécute une seule fois et stoppe True ou False

📌 En configurant one_off=True, la tâche sera désactivée après son exécution une fois, mais ne sera pas supprimée.

📌 En utilisant le champ clocked, vous pouvez planifier une tâche pour s'exécuter exactement à un moment spécifique.

🎯 Conclusion : Utilisez update_or_create pour gérer les tâches programmées de manière flexible !

📌 En utilisant update_or_create() lors de l'enregistrement de tâches programmées dans Django-Celery-Beat, vous pouvez facilement modifier des tâches existantes.

📌 Le champ PeriodicTask.interval faisant référence à IntervalSchedule, il faut d'abord créer une instance IntervalSchedule avant de l'associer.

📌 Pour gérer des tâches programmées complexes, il est plus flexible d'utiliser des champs tels que args, kwargs, enabled, one_off, et clocked.

🔥 Annonce du prochain épisode

Dans cet épisode, nous avons examiné comment créer et modifier PeriodicTask de manière plus flexible.

Dans le prochain épisode, nous allons traiter la configuration de tâches programmées exécutées à des moments spécifiques avec Crontab, ainsi que celles exécutées une seule fois à une heure fixe avec Clocked.

Si vous souhaitez en savoir plus sur l'utilisation approfondie de Celery, restez à l'écoute pour le prochain épisode ! 🚀

Et si vous désirez lire d'autres articles liés à Celery sur le blog,

n'hésitez pas à chercher "Celery" dans la liste des 'articles similaires' ci-dessous ou dans la barre de recherche en haut à droite ! 😊