Python + Céleri: emplois Chaînage?
Question
Le documentation Céleri suggère que c'est une mauvaise idée d'avoir des tâches attendent les résultats d'autres tâches ... Mais la solution proposée (voir rubrique « bon ») laisse un peu à désirer. Plus précisément, il n'y a pas de façon claire d'obtenir le dos de résultat de la sous-tâche à l'appelant (aussi, il est un peu laid).
Alors, est-il possible d'emplois « Enchaînement », de sorte que l'appelant obtient le résultat du travail final? Par exemple, pour utiliser l'exemple de add
:
>>> add3 = add.subtask(args=(3, ))
>>> add.delay(1, 2, callback=add3).get()
6
Sinon, est-il OK pour revenir cas de résultat? Par exemple:
@task
def add(x, y, callback=None):
result = x + y
if callback:
return subtask(callback).delay(result)
return result
Cela permettrait le résultat du travail « finale » de la chaîne pourrait être un simple ren- voyées:
result = add(1, 2, callback=add3).delay()
while isinstance(result, Result):
result = result.get()
print "result:", result
La solution
Vous pouvez le faire avec une chaîne de céleri. Voir https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains
@task()
def add(a, b):
time.sleep(5) # simulate long time processing
return a + b
travail Enchaînement:
# import chain from celery import chain
# the result of the first add job will be
# the first argument of the second add job
ret = chain(add.s(1, 2), add.s(3)).apply_async()
# another way to express a chain using pipes
ret2 = (add.s(1, 2) | add.s(3)).apply_async()
...
# check ret status to get result
if ret.status == u'SUCCESS':
print "result:", ret.get()