Version: | 2.7.0 |
---|---|
Web: | http://django-celery-beat.readthedocs.io/ |
Herunterladen: | http://pypi.python.org/pypi/django-celery-beat |
Quelle: | http://github.com/celery/django-celery-beat |
Schlüsselwörter: | Django, Sellerie, Beat, periodische Aufgabe, Cron, Terminplanung |
Mit dieser Erweiterung können Sie den periodischen Aufgabenplan in der Datenbank speichern.
Die periodischen Aufgaben können über die Django-Administratoroberfläche verwaltet werden. Dort können Sie periodische Aufgaben erstellen, bearbeiten und löschen und festlegen, wie oft sie ausgeführt werden sollen.
Anweisungen zur Verwendung und Installation dieser Erweiterung finden Sie in der Celery-Dokumentation.
Warnung
Wenn Sie die Django TIME_ZONE
Einstellung ändern, basiert Ihr regelmäßiger Aufgabenplan weiterhin auf der alten Zeitzone.
Um das zu beheben, müssten Sie die „letzte Laufzeit“ für jede periodische Aufgabe zurücksetzen:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Notiz
Dadurch wird der Status zurückgesetzt, als ob die periodischen Aufgaben noch nie zuvor ausgeführt worden wären.
django_celery_beat.models.PeriodicTask
Dieses Modell definiert eine einzelne periodische Aufgabe, die ausgeführt werden soll.
Es muss mit einem Zeitplan verknüpft sein, der definiert, wie oft die Aufgabe ausgeführt werden soll.
django_celery_beat.models.IntervalSchedule
Ein Zeitplan, der in einem bestimmten Intervall ausgeführt wird (z. B. alle 5 Sekunden).
django_celery_beat.models.CrontabSchedule
Ein Zeitplan mit Feldern wie Einträgen in Cron: minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Dieses Modell wird nur als Index verwendet, um zu verfolgen, wann sich der Zeitplan geändert hat.
Immer wenn Sie eine PeriodicTask
aktualisieren, wird auch ein Zähler in dieser Tabelle erhöht, der den celery beat
-Dienst anweist, den Zeitplan neu aus der Datenbank zu laden.
Wenn Sie periodische Aufgaben in großen Mengen aktualisieren, müssen Sie den Zähler manuell aktualisieren:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Um eine periodische Aufgabe zu erstellen, die in einem Intervall ausgeführt wird, müssen Sie zunächst das Intervallobjekt erstellen:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
Das sind alle Felder, die Sie benötigen: ein Periodentyp und die Häufigkeit.
Sie können zwischen einem bestimmten Satz von Zeiträumen wählen:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Notiz
Wenn alle 10 Sekunden mehrere periodische Aufgaben ausgeführt werden, sollten diese alle auf dasselbe Zeitplanobjekt verweisen.
Es steht auch ein „Auswahl-Tupel“ zur Verfügung, falls Sie dies dem Benutzer präsentieren müssen:
>> > IntervalSchedule . PERIOD_CHOICES
Nachdem wir nun das Zeitplanobjekt definiert haben, können wir den periodischen Aufgabeneintrag erstellen:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
Beachten Sie, dass dies ein sehr einfaches Beispiel ist. Sie können auch die Argumente und Schlüsselwortargumente angeben, die zum Ausführen der Aufgabe verwendet werden, die queue
, an die sie gesendet werden soll[*], und eine Ablaufzeit festlegen.
Hier ist ein Beispiel zur Angabe der Argumente. Beachten Sie, wie die JSON-Serialisierung erforderlich ist:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | Sie können auch AMQP-Routing auf niedriger Ebene mithilfe der Felder exchange und routing_key verwenden. |
Ein Crontab-Zeitplan verfügt über die Felder: minute
, hour
, day_of_week
, day_of_month
und month_of_year
. Wenn Sie also das Äquivalent eines Crontab-Eintrags mit 30 * * * *
(30 Minuten nach jeder Stunde ausführen) möchten, geben Sie Folgendes an:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
Der Crontab-Zeitplan ist über den Eingabeparameter „timezone“ mit einer bestimmten Zeitzone verknüpft.
Um dann mithilfe dieses Zeitplans eine periodische Aufgabe zu erstellen, verwenden Sie denselben Ansatz wie bei der intervallbasierten periodischen Aufgabe weiter oben in diesem Dokument, geben jedoch anstelle von interval=schedule
crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Sie können das enabled
Flag verwenden, um eine periodische Aufgabe vorübergehend zu deaktivieren:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
Die periodischen Aufgaben benötigen weiterhin „Arbeiter“, um sie auszuführen. Stellen Sie daher sicher, dass das Standardpaket Celery installiert ist. (Falls nicht installiert, befolgen Sie bitte die Installationsanweisungen hier: https://github.com/celery/celery)
Sowohl der Worker- als auch der Beat-Dienst müssen gleichzeitig ausgeführt werden.
Starten Sie einen Celery-Worker-Dienst (geben Sie Ihren Django-Projektnamen an):
$ celery -A [Projektname] Worker --loglevel=info
Starten Sie als separaten Prozess den Beat-Dienst (geben Sie den Django-Planer an):
$ celery -A [Projektname] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
ODER Sie können das -S (Scheduler-Flag) verwenden. Weitere Optionen finden Sie unter celery beat --help
):
$ celery -A [Projektname] beat -l info -S django
Alternativ können Sie auch die beiden oben genannten Schritte (Worker- und Beat-Dienste) mit nur einem Befehl ausführen ( nur für Entwicklungsumgebungen empfohlen):
$ celery -A [Projektname] worker --beat --scheduler django --loglevel=info
Jetzt können Sie Ihre regelmäßigen Aufgaben über die Django-Administratoroberfläche hinzufügen und verwalten.
Sie können django-celery-beat entweder über den Python Package Index (PyPI) oder aus der Quelle installieren.
So installieren Sie mit pip
:
$ pip install --upgrade django-celery-beat
Laden Sie die neueste Version von django-celery-beat von http://pypi.python.org/pypi/django-celery-beat herunter
Sie können es wie folgt installieren:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
Fügen Sie nach der Installation django_celery_beat
zum Einstellungsmodul von Django hinzu:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Führen Sie die django_celery_beat
-Migrationen aus mit:
$ python manage.py migrate django_celery_beat
Sie können die neueste Hauptversion von django-celery-beat mit dem folgenden pip-Befehl installieren:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Um eine lokale Entwicklungskopie von django-celery-beat mit dem Django-Administrator unter http://127.0.0.1:58000/admin/ zu starten, führen Sie Folgendes aus:
$ docker-compose up --build
Melden Sie sich als Benutzer admin
mit dem Passwort admin
an.
Wenn Sie ein Projekt haben, das Zeitzonen-naiv ist, können Sie DJANGO_CELERY_BEAT_TZ_AWARE=False
in Ihrer Einstellungsdatei festlegen.
Die Betreuer von django-celery-beat und Tausenden anderer Pakete arbeiten mit Tidelift zusammen, um kommerziellen Support und Wartung für die Open-Source-Abhängigkeiten bereitzustellen, die Sie zum Erstellen Ihrer Anwendungen verwenden. Sparen Sie Zeit, reduzieren Sie Risiken und verbessern Sie den Zustand des Codes, während Sie gleichzeitig die Betreuer der genauen Abhängigkeiten bezahlen, die Sie verwenden. Erfahren Sie mehr.