Executando uma tarefa após todas as tarefas terem sido concluídas
Estou escrevendo um aplicativo que precisa executar uma série de tarefas em paralelo e, em seguida, uma única tarefa com os resultados de todas as tarefas executadas:
@celery.task
def power(value, expo):
return value ** expo
@celery.task
def amass(values):
print str(values)
É um exemplo muito simplista e simplista, mas espero que o ponto se apresente bem. Basicamente eu tenhomuitos itens que precisam passar porpower
, mas eu só quero correramass
nos resultados de todas as tarefas. Tudo isso deve acontecer de forma assíncrona, e eu não preciso de nada de volta doamass
método.
Alguém sabe como configurar isso no aipo para que tudo seja executado de forma assíncrona e um único retorno de chamada com uma lista dos resultados é chamado depois de tudo dito e feito?
Eu configurei este exemplo para rodar com umchord
como Alexander Afanasiev recomendou:
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)
Infelizmente, no exemplo acima, todas as tarefas emtasks
são iniciados somente quando ochord
método é chamado. Existe uma maneira que cada tarefa pode iniciar separadamente e, em seguida, eu poderia adicionar um retorno de chamada ao grupo para executar quando tudo tiver terminado?