In einem vorherigen Artikel haben wir mittels Django-Celery-Beat: Praktisches Beispiel zur Verwendung von PeriodicTask untersucht, wie man geplante Aufgaben mit IntervalSchedule verwaltet.
In echten Projekten ist jedoch die bloße Verwendung der wiederkehrenden (Interval) Methode oft nicht ausreichend.
- Wenn Aufgaben zu bestimmten Zeiten täglich ausgeführt werden müssen
- Wenn eine Aufgabe nur einmal zu einem bestimmten Datum und Uhrzeit ausgeführt werden muss
In solchen Fällen kann man mit Crontab oder Clocked noch präzisere geplante Aufgaben einstellen. 🚀
📌 Sind Sie mit dem Konzept von Crontab nicht vertraut?
➡️ Crontab in Linux richtig verstehen: Automatisierungstipps für Entwickler
Wenn Sie den oben genannten Artikel zuerst lesen, wird es leichter verständlich! 😊
1️⃣ Verwendung von `CrontabSchedule` zur Planung zu bestimmten Zeiten
Crontab ist eine Methode zur Planung von Aufgaben, die in Linux verwendet wird und so eingestellt werden kann, dass sie nur zu bestimmten Zeiten wie Sekunden/Minuten/Stunden/Wochentagen/Daten ausgeführt wird.
Mit Django-Celery-Beat können Sie ebenfalls Aufgaben mit `CrontabSchedule` auf die gleiche Weise planen.
📌 Beispiel: Geplante Aufgabe, die täglich um 9:30 Uhr ausgeführt wird
from django_celery_beat.models import PeriodicTask, CrontabSchedule
import json
# 1️⃣ CrontabSchedule erstellen (täglich um 09:30 Uhr)
schedule, created = CrontabSchedule.objects.get_or_create(
minute="30",
hour="9",
day_of_week="*",
day_of_month="*",
month_of_year="*"
)
# 2️⃣ PeriodicTask erstellen oder aktualisieren
task, created = PeriodicTask.objects.update_or_create(
name="daily_report_task",
defaults={
"crontab": schedule, # CrontabSchedule anwenden
"task": "myapp.tasks.generate_daily_report",
"args": json.dumps([]),
"enabled": True,
}
)
✅ Die obige Einstellung plant die Aufgabe, sodass sie täglich um 9:30 Uhr ausgeführt wird! 🎯
✅ Erklärung der Felder von `CrontabSchedule`
Feldname | Beschreibung | Beispiel |
---|---|---|
`minute` | Die Minute einstellen, in der die Aufgabe ausgeführt werden soll | "0", "30", "*/10" |
`hour` | Die Stunde einstellen, in der die Aufgabe ausgeführt werden soll | "0", "9", "*/6" |
`day_of_week` | Den Wochentag einstellen, an dem die Aufgabe ausgeführt werden soll (0=Sonntag) | "*"(jeden Tag), `"1,3,5"`(Mo/Mi/Fr) |
`day_of_month` | Das Datum einstellen, an dem die Aufgabe ausgeführt werden soll | "*"(jeden Tag), `"1,15"`(1. und 15. jeden Monats) |
`month_of_year` | Den Monat einstellen, in dem die Aufgabe ausgeführt werden soll | "*"(jeden Monat), `"1,6,12"`(Januar, Juni, Dezember) |
2️⃣ Verwendung von `ClockedSchedule` zur einmaligen Ausführung zu einer bestimmten Zeit
`ClockedSchedule` wird verwendet, um Aufgaben zu planen, die nur einmal an einem bestimmten Datum und zu einer bestimmten Uhrzeit ausgeführt werden.
📌 Beispiel: Eine geplante Aufgabe, die einmal am 10. Februar 2025 um 15:00 Uhr ausgeführt wird
from django_celery_beat.models import PeriodicTask, ClockedSchedule
import json
from datetime import datetime
# 1️⃣ ClockedSchedule erstellen (10. Februar 2025 um 15:00 Uhr)
scheduled_time = datetime(2025, 2, 10, 15, 0) # datetime-Objekt ist erforderlich!
schedule, created = ClockedSchedule.objects.get_or_create(
clocked_time=scheduled_time
)
# 2️⃣ PeriodicTask erstellen (one_off=True setzen!)
task, created = PeriodicTask.objects.update_or_create(
name="one_time_task_20250210",
defaults={
"clocked": schedule, # ClockedSchedule anwenden
"task": "myapp.tasks.one_time_email",
"args": json.dumps([]),
"enabled": True,
"one_off": True, # Nach der Ausführung automatisch deaktivieren
}
)
✅ Die obige Einstellung wird so geplant, dass sie einmal am 10. Februar 2025 um 15:00 Uhr ausgeführt wird und anschließend automatisch deaktiviert wird.
- 📌 Bei der Erstellung einer Instanz des ClockedSchedule-Modells muss das
clocked_time
-Feld unbedingt alsdatetime
-Objekt eingegeben werden. - 📌 Die Verwendung von Strings oder anderen Datentypen kann zu Fehlern führen.
📌 Was ist die Beziehung zwischen ClockedSchedule und der one_off-Option?
Wenn Sie im ClockedSchedule
eine Aufgabe erstellen, die nur einmal ausgeführt werden soll, stellen Sie one_off=True
ein und können sich fragen, wie dieses Setting mit dem enabled
-Feld interagiert.
📌 Möchten Sie mehr über die Beziehung zwischen diesen beiden Feldern (clocked_time
und one_off
) erfahren?
➡️ Die Beziehung zwischen one-off und enabled in Celery Beat: Richtiges Verständnis und Verwendung
In dem Artikel wird ausführlich behandelt, wie genau one_off=True funktioniert und wie es sich von enabled unterscheidet, also lesen Sie ihn bitte! 😊
🎯 Fazit: Mit Crontab
und Clocked
können Sie noch ausgefeiltere geplante Aufgaben erstellen!
- Mit CrontabSchedule können Sie wiederkehrende, aber zu bestimmten Zeiten ausgeführte Aufgaben planen!
- Mit ClockedSchedule können Sie einmalige Aufgaben zu einem bestimmten Zeitpunkt planen!
- Bei der Erstellung eines ClockedSchedule muss das
clocked_time
-Feld unbedingt alsdatetime
-Objekt eingegeben werden! - Die Beziehung zwischen
ClockedSchedule
und derone_off=True
-Einstellung wird in einem separaten Beitrag ausführlicher behandelt, also schauen Sie bitte vorbei!
Wenn Sie mehr über die tiefere Verwendung von Celery erfahren möchten,
sehen Sie sich die Liste der 'ähnlichen Beiträge' unten an oder suchen Sie im Suchfeld oben rechts nach `"Celery"`! 🚀 😊
Add a New Comment