Abrufen aller Aufgaben-IDs aus verschachtelten Ketten und Akkorden

8

Ich benutze Sellerie 3.1.9 mit einem Redis Backend. Die Aufgabe, die ich ausführe, besteht aus mehreren Teilaufgaben, die in Akkorden und Ketten ausgeführt werden. Die Struktur sieht so aus:

  1. bereite
  2. vor
  3. Daten herunterladen (ein Akkord von 2 Arbeitern)
  4. analysiert und speichert heruntergeladene Daten
  5. lang anhaltender Akkord von 4 Arbeitern
  6. finalisieren
  7. Bericht erstellen

Jeder Eintrag in der Liste ist eine Teilaufgabe, sie sind alle miteinander verkettet. Die Schritte 2 und 4 sind Akkorde. Das Ganze wird verdrahtet, indem ein Akkord für Schritt 4 erzeugt wird, dessen Callback eine Kette von 4 ist - & gt; 6, dann wird ein Akkord für Schritt 2 erzeugt, dessen Callback 3 - & gt; erster Akkord. Dann wird schließlich eine Kette erstellt 1 - & gt; zweiter Akkord. Diese Kette wird dann mit delay () gestartet und ihre ID wird in der Datenbank gespeichert.

Das Problem ist zweifach: Erstens möchte ich die ganze Sache widerrufen können und zweitens möchte ich eine benutzerdefinierte on_failure für meine Task-Klasse haben, die etwas aufräumt und den Fehler dem Benutzer meldet.

Momentan speichere ich die Task-ID der Kette. Ich dachte, ich könnte damit die Kette aufheben. Auch im Falle eines Fehlers wollte ich die Kette zum root führen (im on_failure-Handler), um den relevanten Datensatz aus der Datenbank abzurufen. Dies funktioniert nicht, denn wenn Sie eine Instanz von AsyncResult nur mit der ID der Aufgabe erstellen, ist das übergeordnete Attribut None.

Als zweites habe ich versucht, das Ergebnis von serializable () im Ergebnis der äußeren Kette zu speichern. Dies gibt jedoch nicht die gesamte Struktur von AsyncResult-Objekten zurück, sondern gibt nur die IDs der ersten Ebene in der Kette zurück (also nicht die IDs der untergeordneten Elemente in den Akkorden).

Als drittes habe ich versucht, serializable () selbst zu implementieren, aber wie sich herausstellt, liegt der Grund, warum die ursprüngliche Methode nicht über zwei Ebenen hinausgeht, darin, dass die Kinder der Kette sellery.canvas.chord-Objekte sind. anstelle von AsyncResult-Instanzen.

Eine Illustration des Problems:

%Vor%

Druckt Folgendes:

%Vor%

Die erste ID ist die ID der Callback-Kette, die zweite ID stammt von der Akkord-Task selbst und die letzten drei sind die eigentlichen Aufgaben innerhalb des Akkords. Aber ich kann nicht auf das Ergebnis von der Aufgabe in der Callback-Kette (d. H. Die ID der zwei bar.si () -Aufrufe).

Gibt es eine Möglichkeit, um die tatsächlichen Aufgaben IDs zu bekommen?

    
Blubber 10.04.2014, 14:17
quelle

0 Antworten

Tags und Links