Ausführen einer Aufgabe, nachdem alle Aufgaben abgeschlossen wurden

8

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:

%Vor%

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?

    
Naftuli Kay 30.04.2013, 20:57
quelle

4 Antworten

3

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.

    
Naftuli Kay 03.05.2013, 00:07
quelle
3

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.

    
alecxe 01.05.2013 04:03
quelle
0

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.

    
enlavin 02.05.2013 09:23
quelle
0

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:

%Vor%

Das Konvertieren von list in group sollte zu dem von Ihnen erwarteten Verhalten führen:

%Vor%     
Tim McNamara 10.07.2015 00:38
quelle

Tags und Links