Python 芹菜从子任务发出任务

Python 芹菜从子任务发出任务,python,asynchronous,celery,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:

我的“大”任务分步骤工作:它可以终止或生成更多任务。在我的例子中,我数到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
  • 如何异步调用它?我尝试了apply_async和delay的不同变体,但没有效果
  • 我在芹菜监视器中看不到任何任务。为什么?
  • 在异步执行任务时,如何获得中间状态(在本例中,是介于1和5之间的数字)
  • 以我为例,

    @app.task
    def test(x):
        import time
        time.sleep(1)
        print x
        if x == 5:
            return x
        else:
            return test.delay(x+1)
    
  • 当我使用
    res=test.delay(1)
  • 在芹菜监视器中,我可以看到收到的任务

    接收到的任务:服务。任务器。测试[67f22e02-7c39-4c1d-a646-acabeb72d208]
    1
    接收到的任务:服务。任务器。测试[9eed6d45-4931-4790-8477-3bbe75e213e4]
    任务服务.tasker.test[67f22e02-7c39-4c1d-a646-acabeb72d208]在3.021544273s中成功:无
    2

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

  • 在我的测试案例中,结果如下

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

    并使用上面的方法

    >>> print final_result(res)
    5
    

    在这种情况下,我无法获得原始命令的结果。也就是说,1秒钟后就完成了,但是我如何得到5分呢?不,我的问题措词不当。任务在1次迭代后完成;芹菜只是在没有链接到父芹菜的情况下产生一个新芹菜。如何获取上一个任务的异步处理程序?换句话说,您的示例确实符合我的要求:创建5个任务。但最后我只对最后一个的结果感兴趣(如果我有把握的话,我可以得到)。
    >>> print final_result(res)
    5