Ausführen einer Aufgabe, nachdem alle Aufgaben abgeschlossen wurden

Ich schreibe eine Anwendung, die eine Reihe von Aufgaben gleichzeitig ausführen muss, und dann eine einzelne Aufgabe mit den Ergebnissen aller ausgeführten Aufgaben:

@celery.task
def power(value, expo):
    return value ** expo

@celery.task
def amass(values):
    print str(values)

Es ist ein sehr ausgeklügeltes und stark vereinfachtes Beispiel, aber hoffentlich kommt der Punkt gut rüber. Grundsätzlich habe ichviele Gegenstände, die durchlaufen müssenpower, aber ich will nur rennenamass auf die Ergebnisse aller Aufgaben. All dies sollte asynchron geschehen, und ich brauche nichts zurück von deramass Methode.

Weiß jemand, wie man dies in Sellerie einrichtet, damit alles asynchron ausgeführt wird und ein einzelner Rückruf mit einer Liste der Ergebnisse aufgerufen wird, nachdem alles gesagt und getan ist?

Ich habe dieses Beispiel so eingerichtet, dass es mit einer läuftchord als Alexander Afanasiev empfahl:

from time import sleep

import random

tasks = []

for i in xrange(10):
    tasks.append(power.s((i, 2)))
    sleep(random.randint(10, 1000) / 1000.0) # sleep for 10-1000ms

callback = amass.s()

r = chord(tasks)(callback)

Leider sind im obigen Beispiel alle Aufgaben intasks werden erst gestartet, wenn diechord Methode heißt. Gibt es eine Möglichkeit, dass jede Aufgabe einzeln gestartet werden kann und ich dann der Gruppe einen Rückruf hinzufügen kann, um sie auszuführen, wenn alles abgeschlossen ist?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage