Piszę aplikację, która wymaga, aby uruchomić szereg zadań równolegle i następnie pojedyncze zadania z wynikami wszystkich zadań uruchomić:Uruchamianie zadania po wszystkie zadania zostały zakończone
@celery.task
def power(value, expo):
return value ** expo
@celery.task
def amass(values):
print str(values)
To bardzo wymyślny i uproszczony przykład, ale miejmy nadzieję, że punkt dobrze się sprawdza. Zasadniczo mam wiele elementów, które trzeba uruchomić przez power
, ale chcę tylko uruchomić amass
na wyniki wszystkich zadań. Wszystko to powinno się odbywać asynchronicznie i nie potrzebuję niczego z metody amass
.
Czy ktoś wie, jak ustawić to w selera, aby wszystko było wykonywane asynchronicznie i pojedynczego wywołania zwrotnego z listą wyników jest wywoływana po wszystkim jest powiedziane i zrobione?
mam ustawić ten przykład, aby uruchomić z chord
Alexander Afanasiev zalecane:
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)
Niestety, w powyższym przykładzie, wszystkie zadania w tasks
są uruchamiane tylko wtedy, gdy metoda chord
nazywa. Czy istnieje sposób, aby każde zadanie można było uruchomić osobno, a następnie mógłbym dodać wywołanie zwrotne do grupy, aby działało, gdy wszystko się skończy?
Witam, wygląda na to, że jest to dobre podejście, przynajmniej koncepcyjne. Jednak kiedy wypróbowałem go, dokładnie taki sam kod jak powyżej, zgłasza poniżej błąd: 'EncodeError: nie jest JSON serializowany' Naprawdę doceniam pomoc tutaj . –
qre0ct
Ok, rozwiązałem powyższy błąd, przekazując final_task() listę bezpośrednio ID zadania, zamiast przekazać mu listę obiektów zadań, jak to jest zrobione w powyższym przykładzie kodu. Mimo to dzięki za odpowiedź. To bardzo pomogło. – qre0ct