In de vorige post hebben we via Django-Celery-Beat: Praktisch voorbeeld van inplannen met PeriodicTask gekeken naar hoe je het plannen van taken met IntervalSchedule kunt beheren.

In echte projecten zijn er echter vaak meer geavanceerde uitvoeringsopties nodig dan alleen de intervalmethode.

  • Wanneer je taken hebt die op een bepaald tijdstip uitgevoerd moeten worden
  • Wanneer er taken zijn die slechts één keer op een bepaalde datum en tijd moeten worden uitgevoerd

In deze gevallen kan het gebruik van Crontab of Clocked de planning van taken aanzienlijk verfijnen. 🚀

📌 Nog niet bekend met het concept Crontab?

➡️ De Linux `crontab` goed begrijpen: tips voor automatische planning waar ontwikkelaars van houden

Lees die tekst eerst voor een beter begrip! 😊

Django Celery-Beat taakplanning met Crontab en Clocked

1️⃣ Inplannen op specifieke tijd met `CrontabSchedule`

Crontab is een planningsmethode die in Linux wordt gebruikt en die je toestaat om specifieke tijdstippen te plannen op basis van seconden/minuten/uren/dagen van de week/dagen van de maand.

Met Django-Celery-Beat kun je ook `CrontabSchedule` gebruiken om op dezelfde manier taken in te plannen.

📌 Voorbeeld: een taak die elke dag om 09:30 uur wordt uitgevoerd

from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json

# 1️⃣ CrontabSchedule aanmaken (uitgevoeren elke dag om 09:30)
schedule, created = CrontabSchedule.objects.get_or_create(
    minute="30",
    hour="9",
    day_of_week="*",
    day_of_month="*",
    month_of_year="*"
)

# 2️⃣ PeriodicTask aanmaken of bijwerken
task, created = PeriodicTask.objects.update_or_create(
    name="daily_report_task",
    defaults={
        "crontab": schedule,  # Toepassen van CrontabSchedule
        "task": "myapp.tasks.generate_daily_report",
        "args": json.dumps([]),
        "enabled": True,
    }
)

✅ Deze instelling zorgt ervoor dat de taak elke dag om 09:30 uur wordt uitgevoerd! 🎯

✅ Uitleg van de `CrontabSchedule` velden

Veldnaam Uitleg Voorbeeld
`minute` Instelling van de minuten waarop de taak wordt uitgevoerd "0", "30", "*/10"
`hour` Instelling van het uur waarop de taak wordt uitgevoerd "0", "9", "*/6"
`day_of_week` Instelling van de dagen van de week waarop de taak wordt uitgevoerd (0=Zondag) "*" (elke dag), `"1,3,5"` (ma/wo/vrij)
`day_of_month` Instelling van de dagen van de maand waarop de taak wordt uitgevoerd "*" (elke dag), `"1,15"` (1e en 15e van de maand)
`month_of_year` Instelling van de maanden waarop de taak wordt uitgevoerd "*" (elke maand), `"1,6,12"` (januari, juni, december)

2️⃣ Het gebruik van `ClockedSchedule` voor een eenmalige uitvoering op een specifieke tijd

`ClockedSchedule` wordt gebruikt om taken in te plannen die slechts één keer op een specifieke datum en tijd uitgevoerd moeten worden.

📌 Voorbeeld: een taak die slechts één keer wordt uitgevoerd op een specifieke datum (10 februari 2025 om 15:00 uur)

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

# 1️⃣ ClockedSchedule aanmaken (uitvoering op 10 februari 2025 om 15:00)
scheduled_time = datetime(2025, 2, 10, 15, 0)  # datetime-object vereist!
schedule, created = ClockedSchedule.objects.get_or_create(
    clocked_time=scheduled_time
)

# 2️⃣ PeriodicTask aanmaken (one_off=True instelling!)
task, created = PeriodicTask.objects.update_or_create(
    name="one_time_task_20250210",
    defaults={
        "clocked": schedule,  # Toepassen van ClockedSchedule
        "task": "myapp.tasks.one_time_email",
        "args": json.dumps([]),
        "enabled": True,
        "one_off": True,  # Automatisch uitschakelen na uitvoering
    }
)

✅ Deze instelling zorgt ervoor dat de taak slechts één keer wordt uitgevoerd op 10 februari 2025 om 15:00 en vervolgens automatisch wordt uitgeschakeld.

  • 📌 Wanneer je een instantie van het ClockedSchedule-model maakt, moet het veld clocked_time worden ingevoerd als een datetime object.
  • 📌 Gebruik geen strings of andere datatypes, want dit kan tot fouten leiden.

📌 Wat is de relatie tussen ClockedSchedule en de one_off-optie?

Bij het maken van een taak die slechts één keer wordt uitgevoerd in ClockedSchedule, wordt de instelling one_off=True ingesteld, maar
je kunt je afvragen hoe deze instelling interacteert met het enabled veld.

📌 Wil je meer weten over de relatie tussen deze twee velden (clocked_time en one_off)?

➡️ De relatie tussen one-off en enabled in Celery Beat: juiste begrip en gebruik

In die tekst wordt uitvoerig behandeld hoe `one_off=True` precies werkt en wat het verschil is met `enabled`, dus kijk zeker even!

🎯 Conclusie: Crontab en Clocked maken meer verfijnde taakplannen mogelijk!

  • Met CrontabSchedule kun je repetitieve maar op specifieke tijdstippen uitgevoerde taken inplannen!
  • Met ClockedSchedule kun je taken die slechts één keer op een bepaald moment moeten worden uitgevoerd plannen!
  • Bij het aanmaken van ClockedSchedule moet het veld clocked_time als een datetime object worden ingevoerd!
  • De relatie tussen ClockedSchedule en de instelling one_off=True wordt in een aparte post dieper behandeld, dus kijk daar ook naar!

Als je meer wilt weten over het uitgebreide gebruik van Celery,

bezoek dan de onderstaande lijst met 'gerelateerde berichten' of zoek in de zoekbalk rechtsboven op `"Celery"`! 🚀 😊