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
, dass True
. Hier ist eine einfache Aufgabe, die dies testet:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Wann task_track_started
ist False
, was die Standardeinstellung ist , wird die Statusanzeige angezeigt, PENDING
obwohl die Aufgabe gestartet wurde. Wenn Sie setzen task_track_started
auf True
, dann wird der Staat sein STARTED
.
Der Staat PENDING
bedeutet "Ich weiß es nicht."
Ein AsyncResult
mit dem Staat PENDING
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:
>>> task.AsyncResult("invalid").status
'PENDING'
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 hat PENDING
. 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 Verwendung AsyncResult
funktioniert überhaupt nicht, wenn dies der Fall task_ignore_result
ist True
. 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 erstellen AsyncResult
, lautet der Status PENDING
.
Alle "echten Aufgaben" beginnen im PENDING
Zustand. Das Einsteigen PENDING
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
.
x
?