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
Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top