Ich schreibe eine Anwendung, die eine Reihe von Aufgaben parallel ausführen muss und dann eine einzelne Aufgabe mit den Ergebnissen aller ausgeführten Aufgaben:
%Vor% Es ist ein sehr konstruiertes und vereinfachtes Beispiel, aber hoffentlich kommt der Punkt gut rüber. Grundsätzlich habe ich viele Elemente, die power
durchlaufen müssen, aber ich möchte nur amass
für die Ergebnisse aller Aufgaben ausführen. All dies sollte asynchron geschehen, und ich brauche nichts von der Methode amass
zurück.
Weiß jemand, wie man das in Sellerie einrichtet, so dass alles asynchron ausgeführt wird und ein einziger Callback mit einer Liste der Ergebnisse aufgerufen wird, nachdem alles gesagt und getan ist?
Ich habe dieses Beispiel so eingerichtet, dass es mit einem chord
läuft, wie Alexander Afanasiev empfohlen hat:
Leider wurden im obigen Beispiel alle Aufgaben in tasks
nur gestartet, wenn die Methode chord
aufgerufen wurde. Gibt es eine Möglichkeit, dass jede Aufgabe separat gestartet werden kann und ich dann einen Rückruf zu der Gruppe hinzufügen kann, wenn alles fertig ist?
Hier ist eine Lösung, die für meine Zwecke funktioniert hat:
tasks.py :
%Vor%Anwendungsfall:
%Vor% Was dieses tun sollte ist, alle Aufgaben so schnell wie möglich asynchron zu starten. Sobald sie alle in die Warteschlange gestellt wurden, wird die amass
Aufgabe ebenfalls in die Warteschlange gestellt. Die Sammelaufgabe wird sich so lange selbst aktualisieren, bis alle anderen Aufgaben abgeschlossen sind.
Sellerie hat viele Tools für die meisten Workflows, die Sie sich vorstellen können.
Es scheint, dass Sie den Akkord verwenden müssen. Hier ist ein Zitat aus der Dokumentation:
Ein Akkord ist wie eine Gruppe, aber mit einem Rückruf. Ein Akkord besteht aus eine Header-Gruppe und ein Körper, wo der Körper eine Aufgabe ist, die sollte Ausführen, nachdem alle Aufgaben im Header abgeschlossen sind.
Die Antwort, die @ alexander-afanasiev Ihnen gegeben hat, ist im Wesentlichen richtig: Verwenden Sie einen Akkord.
Ihr Code ist in Ordnung, aber tasks.append(power.s((i, 2)))
führt die Teilaufgabe nicht aus, sondern fügt nur Teilaufgaben zu einer Liste. Es ist chord(...)(...)
, das so viele Nachrichten an den Broker sendet, wie Teilaufgaben, die Sie in tasks
list definiert haben, plus eine weitere Nachricht für die Callback-Teilaufgabe. Wenn Sie chord
aufrufen, wird so schnell wie möglich zurückgegeben.
Wenn Sie wissen möchten, wann der Akkord fertig ist, können Sie wie bei einer einzelnen Aufgabe mit r.ready()
in Ihrem Sample nach dem Abschluss suchen.
Wenn Sie sich diesen Ausschnitt aus Ihrer Frage ansehen, sieht es so aus, als ob Sie ein list
als Akkord-Header und nicht als group
übergeben:
Das Konvertieren von list
in group
sollte zu dem von Ihnen erwarteten Verhalten führen: