Wie prüft man, ob eine Aufgabe in Sellerie ausgeführt wird (insbesondere verwende ich Sellerie-Django)?
Ich habe die Dokumentation gelesen und gegoogelt, kann aber keinen Anruf wie folgt sehen:
my_example_task.state() == RUNNING
Mein Anwendungsfall ist, dass ich einen externen (Java) Dienst zum Transcodieren habe. Wenn ich ein Dokument zur Transcodierung sende, möchte ich überprüfen, ob die Aufgabe, die diesen Dienst ausführt, ausgeführt wird, und wenn nicht, es (neu) starten.
Ich verwende die aktuellen stabilen Versionen - 2.4, glaube ich.
python
web-services
celery
django-celery
Marcin
quelle
quelle
x
?async_result
. In Ihrem Anwendungsfall, in dem Sie die Instanz bereits haben, können Sie loslegen. Aber was passiert, wenn Sie nur die Task-ID haben und eineasync_result
Instanz instanziieren müssen, um aufrufen zu könnenasync_result.get()
? Dies ist eine Instanz derAsyncResult
Klasse, aber Sie können die Raw-Klasse nicht verwendencelery.result.AsyncResult
. Sie müssen die Klasse aus der Funktion abrufen, die von umschlossen wirdapp.task()
. Inasync_result = run_instance.AsyncResult('task-id')
but you cannot use the raw class celery.result.AsyncResult, you need to get the class from the function wrapped by app.task().
- Ich denke, so sollte es eigentlich verwendet werden. Lesen Sie den Code: github.com/celery/celery/blob/…Das Erstellen eines
AsyncResult
Objekts aus der Aufgaben-ID wird in den häufig gestellten Fragen empfohlen , um den Aufgabenstatus zu erhalten, wenn Sie nur die Aufgaben-ID haben.Ab Sellerie 3.x gibt es jedoch erhebliche Einschränkungen, die Menschen beißen können, wenn sie nicht auf sie achten. Es hängt wirklich vom spezifischen Anwendungsfall ab.
Standardmäßig zeichnet Sellerie keinen "laufenden" Zustand auf.
Damit Sellerie aufzeichnet, dass eine Aufgabe ausgeführt wird, müssen Sie festlegen
task_track_started
, dassTrue
. Hier ist eine einfache Aufgabe, die dies testet:Wann
task_track_started
istFalse
, was die Standardeinstellung ist , wird die Statusanzeige angezeigt,PENDING
obwohl die Aufgabe gestartet wurde. Wenn Sie setzentask_track_started
aufTrue
, dann wird der Staat seinSTARTED
.Der Staat
PENDING
bedeutet "Ich weiß es nicht."Ein
AsyncResult
mit dem StaatPENDING
bedeutet nichts weiter als dass Sellerie den Status der Aufgabe nicht kennt. Dies kann verschiedene Gründe haben.Zum einen
AsyncResult
kann mit ungültigen Task-IDs erstellt werden. Solche "Aufgaben" werden von Sellerie als anhängig angesehen:Ok, also wird niemand offensichtlich ungültige IDs füttern
AsyncResult
. Fair genug, aber es hat auch Auswirkungen,AsyncResult
die auch eine Aufgabe berücksichtigen, die erfolgreich ausgeführt wurde, die Sellerie jedoch vergessen hatPENDING
. Auch in einigen Anwendungsszenarien kann dies ein Problem sein. Ein Teil des Problems hängt davon ab, wie Sellerie so konfiguriert ist, dass die Ergebnisse von Aufgaben gespeichert werden, da dies von der Verfügbarkeit der "Grabsteine" im Ergebnis-Backend abhängt. ("Tombstones" ist der Begriff, der in der Sellerie-Dokumentation für die Datenblöcke verwendet wird, die aufzeichnen, wie die Aufgabe beendet wurde.) Die VerwendungAsyncResult
funktioniert überhaupt nicht, wenn dies der Falltask_ignore_result
istTrue
. Ein ärgerlicheres Problem ist, dass Sellerie die Grabsteine standardmäßig abläuft. Dasresult_expires
Die Standardeinstellung ist 24 Stunden. Wenn Sie also eine Aufgabe starten und die ID im Langzeitspeicher aufzeichnen und 24 Stunden später eine ID damit erstellenAsyncResult
, lautet der StatusPENDING
.Alle "echten Aufgaben" beginnen im
PENDING
Zustand. Das EinsteigenPENDING
in eine Aufgabe kann also bedeuten, dass die Aufgabe angefordert wurde, aber nie weiter fortgeschritten ist (aus welchem Grund auch immer). Oder es könnte bedeuten, dass die Aufgabe ausgeführt wurde, aber Sellerie ihren Zustand vergessen hat.Autsch!
AsyncResult
wird nicht für mich arbeiten. Was kann ich sonst noch tun?Ich ziehe es vor, die Ziele im Auge zu behalten, als die Aufgaben selbst im Auge zu behalten . Ich behalte einige Aufgabeninformationen, aber es ist wirklich zweitrangig, die Ziele zu verfolgen. Die Ziele werden unabhängig von Sellerie gespeichert. Wenn eine Anforderung eine Berechnung durchführen muss, die davon abhängt, dass ein Ziel erreicht wurde, prüft sie, ob das Ziel bereits erreicht wurde. Wenn ja, verwendet sie dieses zwischengespeicherte Ziel. Andernfalls wird die Aufgabe gestartet, die das Ziel beeinflusst, und an gesendet Der Client, der die HTTP-Anforderung zu einer Antwort gemacht hat, die angibt, dass er auf ein Ergebnis warten soll.
Die obigen Variablennamen und Hyperlinks gelten für Sellerie 4.x. In 3.x die entsprechenden Variablen und Hyperlinks sind:
CELERY_TRACK_STARTED
,CELERY_IGNORE_RESULT
,CELERY_TASK_RESULT_EXPIRES
.quelle
Jedes
Task
Objekt hat eine.request
Eigenschaft, die es enthältAsyncRequest
. Dementsprechend gibt die folgende Zeile den Status einer Aufgabe antask
:quelle
Sie können auch benutzerdefinierte Status erstellen und die Ausführung der Aufgaben für den Wert aktualisieren. Dieses Beispiel stammt aus Dokumenten:
http://celery.readthedocs.org/en/latest/userguide/tasks.html#custom-states
quelle
Alte Frage, aber ich bin kürzlich auf dieses Problem gestoßen.
Wenn Sie versuchen, die task_id abzurufen, können Sie dies folgendermaßen tun:
Jetzt wissen Sie genau, was die task_id ist, und können sie jetzt verwenden, um das AsyncResult abzurufen:
quelle
apply_async
. Das von zurückgegebene Objektapply_async
ist einAsyncResult
Objekt, das die ID der von Celery generierten Aufgabe enthält.task_id
müssen Sie selbst eine Aufgaben-ID generieren . In Ihrem Kommentar haben Sie sich einen Grund vorgestellt, der über "Wie überprüfe ich den Aufgabenstatus?" Und "Wenn Sie versuchen, die task_id zu erhalten ..." hinausgeht. Großartig, wenn Sie diesen Bedarf haben, aber dies ist nicht der Fall hier. (Außerdem macht die Verwendunguuid()
zum Generieren einer Aufgaben-ID absolut nichts anderes als das, was Sellerie standardmäßig tut.)Verwenden Sie einfach diese API aus den Sellerie-FAQ
Das funktioniert gut.
quelle
Antwort von 2020:
quelle
Versuchen:
task.AsyncResult(task.request.id).state
Dadurch wird der Status der Sellerie-Aufgabe angezeigt. Wenn sich die Sellerie-Aufgabe bereits im Status FEHLER befindet , wird eine Ausnahme ausgelöst :
raised unexpected: KeyError('exc_type',)
quelle
Für einfache Aufgaben können wir http://flower.readthedocs.io/en/latest/screenshots.html und http://policystat.github.io/jobtastic/ verwenden , um die Überwachung durchzuführen.
und für komplizierte Aufgaben sagen wir eine Aufgabe, die sich mit vielen anderen Modulen befasst. Wir empfehlen, den Fortschritt und die Meldung auf der jeweiligen Taskeinheit manuell aufzuzeichnen.
quelle
Ich fand hilfreiche Informationen in der
Sellerieprojekt Arbeiterhandbuch Inspektionsarbeiter
In meinem Fall überprüfe ich, ob Sellerie läuft.
Sie können mit inspect spielen, um Ihre Bedürfnisse zu erfüllen.
quelle
vi my_celery_apps / app1.py
vi task / task1.py
quelle
Abgesehen von dem oben genannten programmatischen Ansatz ist der Status der Verwendung der Blumenaufgabe leicht zu erkennen.
Echtzeitüberwachung mit Sellerieereignissen. Flower ist ein webbasiertes Tool zur Überwachung und Verwaltung von Sellerie-Clustern.
Offizielles Dokument: Blumen - Sellerie - Überwachungstool
Installation:
Verwendung:
quelle
quelle