芹菜从子任务发出任务

时间:2014-02-05 10:28:27

标签: python asynchronous celery

我的“大”任务分步进行:它可以终止或产生更多任务。在我的例子中,我数到5。

from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
from time import sleep

@app.task
def slow_add(x):
    """Slowly counts to 5"""
    sleep(1)
    print (x)
    if x == 5:
        return x
    else:
        return slow_add.s(x+1)()

当我安排任务时,我只得到一次调用:

In [48]: asks.slow_add.run(1)
1
2
3
4
5
Out[48]: 5
  1. 如何异步调用它?我尝试了apply_async的不同变体,延迟,但没有用。
  2. 我看到芹菜监视器没有任务。为什么?
  3. 当任务异步执行时,如何获得中间状态(在本例中为1到5之间的数字)?

1 个答案:

答案 0 :(得分:2)

在我的例子中,

@app.task
def test(x):
    import time
    time.sleep(1)
    print x
    if x == 5:
        return x
    else:
        return test.delay(x+1)
  1. 当我使用res = test.delay(1)
  2. 时,它可以异步工作
  3. 在Celery监视器中,我可以看到收到的任务

      
        

    收到的任务:services.tasker.test [67f22e02-7c39-4c1d-a646-acabeb72d208]
    1     
    收到的任务:services.tasker.test [9eed6d45-4931-4790-8477-3bbe75e213e4]
        任务services.tasker.test [67f22e02-7c39-4c1d-a646-acabeb72d208]成功进入3.021544273s:无
    2
    ...

      
  4. 您可以使用res.ready()获取任务状态,任务完成后返回True,否则返回False

  5. 在我的测试用例中,结果如

    >>> res = test.delay(1)
    >>> res.ready()  # before finishing task
    False
    >>> res.ready()  # after finishing task
    True
    

    def final_result(r):
        if isinstance(r.result, celery.result.AsyncResult):
             return final_result(r.result)
        else:
            return r.result
    

    并使用上面的

    >>> print final_result(res)
    5