Wie man eine Sellerie Aufgabe scheitern innerhalb der Aufgabe?
Unter bestimmten Bedingungen, ich möchte eine Sellerie-Aufgabe nicht aus, dass innerhalb dieser Aufgabe. Ich habe versucht, die folgenden:
from celery.task import task
from celery import states
@task()
def run_simulation():
if some_condition:
run_simulation.update_state(state=states.FAILURE)
return False
Jedoch die Aufgabe noch Berichte gelungen:
Task-sim.Aufgaben.run_simulation[9235e3a7-c6d2-4219-bbc7-acf65c816e65]
es gelang 1.17847704887 s: False
Scheint es, dass der Status kann nur geändert werden, während die Aufgabe ausgeführt wird, und sobald es abgeschlossen ist - Sellerie ändert den Zustand, um was es hält, ist das Ergebnis (siehe diese Frage). Gibt es eine Möglichkeit, ohne zu Versagen, die Aufgabe durch das auslösen einer exception, um Sellerie zurück, dass Sie die Aufgabe gescheitert ist?
- Haben Sie versucht, um eine Ausnahme in deinem code?
- Das auslösen einer exception macht in der Tat der Aufgabe scheitern, die beinhaltet, senden Sie mir eine E-Mail jedesmal, wenn das passiert - etwas, was ich gerne vermeiden möchte. Sorry für unklar zu sein, den ich verändert habe die Frage jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zum markieren einer Aufgabe als fehlgeschlagen, ohne eine Ausnahme auszulösen, aktualisieren Sie den task-Status zu
FAILURE
und dann zu erhöhen, eineIgnore
Ausnahme, weil die Rückgabe eines Wertes wird aufgezeichnet, die Aufgabe als erfolgreich, ein Beispiel:Aber der beste Weg ist, um eine Ausnahme von Ihrer Aufgabe, können Sie erstellen eine benutzerdefinierte Ausnahme zu verfolgen, diese Fehler:
Und heben diese Ausnahme aus Ihre Aufgabe:
Bekam ich eine interessante Antwort auf diese Frage von Ask Solem, wo er schlägt ein "after_return' - handler, um das Problem zu lösen. Dies könnte eine interessante option für die Zukunft.
In der Zwischenzeit habe ich das Problem gelöst, indem einfach Rückgabe eines string 'FEHLER' von der Aufgabe, wenn ich es machen will, Versagen und dann die überprüfung für diesen wie folgt:
result.state in READY_STATES | EXCEPTION_STATES:
wofrom celery.states import READY_STATES, EXCEPTION_STATES, UNREADY_STATES
Möchte ich weiter ausbauen und auf Pierre ' s Antwort, als ich angetroffen habe einige Probleme mit den vorgeschlagenen Lösung.
Erlauben, benutzerdefinierte Felder, die beim aktualisieren einer task-Status-Staaten.SCHEITERN, ist es wichtig, auch mock-einige Attribute, die ein VERSAGEN der Staat hätte (Hinweis exc_type und exc_message)
Während die Lösung beendet, die Aufgabe, jeden Versuch, die Abfrage des Status (Zum Beispiel zum abrufen der 'GRUND FÜR den AUSFALL" - Wert) wird scheitern.
Unten ist ein Ausschnitt für die Referenz, die ich nahm:
https://www.distributedpython.com/2018/09/28/celery-task-states/