Ich habe das Dokument gelesen und gesucht, kann aber keine eindeutige Antwort finden:
Können Sie eine bereits ausgeführte Aufgabe abbrechen? (Wie in der Aufgabe begonnen, dauert es eine Weile, und die Hälfte der Aufgabe muss abgebrochen werden)
Ich fand dies aus dem Dokument bei Celery FAQ
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Ich bin mir jedoch nicht sicher, ob dadurch Aufgaben in der Warteschlange abgebrochen werden oder ob ein laufender Prozess auf einem Worker abgebrochen wird. Vielen Dank für jedes Licht, das Sie werfen können!
quelle
In Celery 3.1 wird die API zum Widerrufen von Aufgaben geändert.
Gemäß den FAQ zu Sellerie sollten Sie result.revoke verwenden:
oder wenn Sie nur die Aufgaben-ID haben:
quelle
@ 0x00mh Antwort richtig ist, aber die letzte Sellerie docs sagen , dass die Verwendung von
terminate
Option „ist für Administratoren ein letzter Ausweg “ , weil Sie versehentlich eine andere Aufgabe beenden können , die in der Zwischenzeit begonnen Ausführung. Möglicherweise ist eine bessere Lösung die Kombinationterminate=True
mitsignal='SIGUSR1'
(wodurch die SoftTimeLimitExceeded-Ausnahme in der Aufgabe ausgelöst wird).quelle
SoftTimeLimitExceeded
in meiner Aufgabe ausgelöst wird, wird meine benutzerdefinierte Bereinigungslogik (implementiert übertry
/except
/finally
) aufgerufen. Dies ist meiner Ansicht nach viel besser als das, was esAbortableTask
bietet ( docs.celeryproject.org/en/latest/reference/… ). Bei letzterem benötigen Sie ein Datenbankergebnis-Backend und müssen den Status einer laufenden Aufgabe manuell und wiederholt überprüfen, um festzustellen, ob sie abgebrochen wurde.worker_prefetch_multiplier = 1
da ich nur ein paar lange laufende Aufgaben habe, sollte das Beenden in Ordnung sein - da durch das Beenden keine anderen Aufgaben ausgeführt werden - habe ich das richtig verstanden? @ SpicyramenSiehe die folgenden Optionen für Aufgaben: time_limit , soft_time_limit (oder Sie können es für Worker festlegen). Wenn Sie nicht nur Zeit der Ausführung steuern möchten, dann sehen abläuft Argument apply_async Methode.
quelle
Unbefriedigend gibt es auch eine andere Möglichkeit (Aufgabe abbrechen), um die Aufgabe zu stoppen, aber es gibt viele Unzuverlässigkeiten, weitere Details finden Sie unter: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable .html
quelle