Ich habe es geschafft, periodische Aufgaben in Django-Sellerie zu bekommen, indem ich PeriodicTask abbaute. Ich habe versucht, eine Testaufgabe zu erstellen und sie so zu starten, dass sie etwas nutzlos macht. Es klappt.
Jetzt kann ich es nicht stoppen. Ich habe die Dokumentation gelesen und kann nicht herausfinden, wie die Aufgabe aus der Ausführungswarteschlange entfernt wird. Ich habe versucht, selleryctl und die Shell zu verwenden, aber registry.tasks () ist leer, so kann ich nicht sehen, wie man es entfernt.
Ich habe Vorschläge gesehen, dass ich es "widerrufen" sollte, aber dafür brauche ich eine Aufgaben-ID, und ich kann nicht sehen, wie ich die Aufgaben-ID finden würde.
Danke.
Eine Aufgabe ist eine Nachricht, und eine "periodische Aufgabe" sendet Aufgabennachrichten in periodischen Intervallen. Für jede gesendete Aufgabe wird eine eindeutige ID zugewiesen.
revoke
bricht nur eine einzelne Aufgabenmeldung ab. Um die ID für eine Aufgabe zu erhalten, müssen Sie sie behalten
Verfolgen der gesendeten ID, aber Sie können auch eine benutzerdefinierte ID angeben, wenn Sie eine Aufgabe senden.
Ich bin mir nicht sicher, ob Sie eine einzelne Aufgabennachricht abbrechen möchten oder ob Sie die periodische Aufgabe daran hindern möchten, weitere Nachrichten zu senden. Daher listet ich die Antworten für beide auf.
Es gibt keine integrierte Möglichkeit, die ID einer Aufgabe mit periodischen Aufgaben zu senden. aber Sie könnten die ID für jede Aufgabe auf diese Weise auf den Namen der periodischen Aufgabe setzen Die ID bezieht sich auf jede Aufgabe, die mit der periodischen Aufgabe (normalerweise die letzte) gesendet wird. Sie können auf diese Weise eine benutzerdefinierte ID angeben,
entweder mit dem @periodic_task
Decorator:
oder mit der Einstellung CELERYBEAT_SCHEDULE
:
Wenn Sie eine periodische Aufgabe entfernen möchten, entfernen Sie einfach @periodic_task
aus der Codebasis oder entfernen Sie den Eintrag aus CELERYBEAT_SCHEDULE
.
Wenn Sie den Django-Datenbank-Scheduler verwenden, müssen Sie die periodische Aufgabe entfernen
von der Django Admin-Schnittstelle.
PS1: revoke
beendet eine Aufgabe nicht, die bereits gestartet wurde. Es bricht nur ab
Aufgaben, die noch nicht gestartet wurden. Sie können eine laufende Aufgabe mit beenden
%Code%. Standardmäßig wird das Signal revoke(task_id, terminate=True)
an gesendet
der Prozess, wenn Sie ein anderes Signal (z. B. KILL) senden möchten, verwenden
TERM
.
PS2: revoke ist ein Fernsteuerbefehl und wird daher nur von RabbitMQ unterstützt
und Redis Broker-Transporte.
Wenn Sie möchten, dass Ihre Aufgabe die Stornierung unterstützt, sollten Sie dies tun, indem Sie ein revoke(task_id, terminate=True, signal="KILL")
speichern.
in einer Datenbank markieren und die Aufgabe beim Start dieses Flags überprüfen lassen:
Nur für den Fall, dass dies jemandem helfen könnte ... Wir hatten das gleiche Problem bei der Arbeit, und es gibt einige Bemühungen, eine Art Managementbefehl zu finden, um die periodische Aufgabe zu entfernen, was wir nicht konnten. Also hier sind ein paar Hinweise.
Sie sollten wahrscheinlich zuerst überprüfen, welche Scheduler-Klasse Sie verwenden.
Der Standard-Scheduler ist sellery.beat.PersistentScheduler, der einfach die letzten Laufzeiten in einer lokalen Datenbankdatei (einem Shelve) verfolgt.
In unserem Fall verwendeten wir den djcellery.schedulers.DatabaseScheduler Klasse.
django-sellery wird außerdem mit einem Scheduler geliefert, der den Zeitplan in der Django-Datenbank speichert
Obwohl in der Dokumentation erwähnt wird, wie die periodischen Aufgaben entfernt werden können:
Mit dem Scheduler django-sellery können Sie regelmäßige Aufgaben vom Django Admin hinzufügen, ändern und entfernen.
Wir wollten das Entfernen programmgesteuert oder über einen (Sellerie / Management) -Befehl in einer Shell durchführen.
Da wir keine Befehlszeile finden konnten, haben wir die django / python-Shell verwendet:
%Vor%Ich hoffe, das hilft!
Tags und Links django celery rabbitmq django-celery