ich eine Anwendung Ich schreibe die eine Reihe von Aufgaben parallel ausgeführt werden muss und dann eine einzelne Aufgabe mit den Ergebnissen aller Aufgaben ausführen:eine Aufgabe Laufen, nachdem alle Aufgaben abgeschlossen wurden
@celery.task
def power(value, expo):
return value ** expo
@celery.task
def amass(values):
print str(values)
Es ist ein sehr konstruiertes und vereinfachtes Beispiel, aber hoffentlich kommt der Punkt gut rüber. Grundsätzlich habe ich viele Elemente, die durch power
laufen müssen, aber ich möchte nur amass
auf die Ergebnisse von allen Aufgaben ausführen. All dies sollte asynchron passieren, und ich brauche nichts zurück von der amass
Methode.
Kann jemand in Sellerie einrichten, so dass alles asynchron ausgeführt wird und ein einziger Rückruf mit einer Liste der Ergebnisse aufgerufen wird, nachdem alles gesagt und getan ist?
ich Setup habe dieses Beispiel mit einem chord
als Alexander Afanasiev laufen empfohlen:
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 ist in dem obigen Beispiel alle Aufgaben in tasks
gestartet werden, nur dann, wenn die chord
Methode aufgerufen wird. Gibt es eine Möglichkeit, dass jede Aufgabe einzeln gestartet werden kann und ich dann einen Rückruf zu der Gruppe hinzufügen kann, die ausgeführt wird, wenn alles fertig ist?
Hallo, sieht so aus, als ob das Konzept zumindest konzeptionell gut ist. Jedoch, wenn ich es ausprobierte, der genau gleiche Code wie oben, wirft es den folgenden Fehler: 'EncodeError: ist nicht JSON serializable' Würde wirklich etwas Hilfe hier schätzen . –
qre0ct
Ok, ich löste den obigen Fehler, indem ich die final_task() eine Liste von taskIds selbst übergebe, anstatt sie an die Liste der Aufgabenobjekte zu übergeben, wie im obigen Codebeispiel. Danke trotzdem für die Antwort. Es hat sehr geholfen. – qre0ct