Periodische Aufgaben in Django-Sellerie stoppen / löschen

7

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.

    
Jonathan May 22.11.2011, 17:14
quelle

2 Antworten

21

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:

%Vor%

oder mit der Einstellung CELERYBEAT_SCHEDULE :

%Vor%

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:

%Vor%     
asksol 22.11.2011, 18:23
quelle
3

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!

    
sylvain 09.10.2015 21:56
quelle