Question

I found that celery supports task chains: http://celery.readthedocs.org/en/latest/userguide/canvas.html#chains.

Question is: how can I stop chain's execution in a task?

For example, we got a chain of N items (N > 2). And in the second task we realize that we do not need all the rest tasks to be executed. What to do?

Was it helpful?

Solution

In newer versions of celery (3.1.6) you can revoke an entire chain by simply walking the chain and revoking each item in turn.

# Build a chain for results
from tasks import addd
from celery import chain

def revoke_chain(result):
    while result:
        result.revoke()
        result = result.parent

# independent tasks (with immutable signatures)
c = chain(*tuple(add.si(i,i) for i in xrange(50)))
h = c()

# some time later ...
revoke_chain(h)

# dependant task
c = add.s(1,1) | add.s(2) | add.s(3)
h = c()

# some time later ...
revoke_chain(h)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top