Celery 4.0.2 AsyncResult.then不工作

时间:2017-06-13 16:03:26

标签: python asynchronous promise celery celery-task

我想采用所示的承诺协议in the docs。 提供的示例有效,但承诺在工作方处理。 相反,我希望得到客户的通知。

这是我的test.py:

from celery import Celery

app = Celery(broker='amqp://', backend='rpc')

@app.task
def add(x, y):
    return x + y

在客户端,我输入以下命令:

import test
test.add.delay(2, 2).then(lambda: print('OK'))

在谷歌搜索时,我碰到this所以显然我不是唯一一个努力理解它应该如何工作的人。

我的理解是,一旦任务被处理完毕,结果应该被发送回客户端,然后回调应该触发,但事实并非如此,我的承诺永远不会得到解决。

我的理解是否正确? 这是理想的行为吗?

THX

1 个答案:

答案 0 :(得分:0)

根据后端,分辨率的“检查”不会自动发生。您需要积极.ready().wait()。您可能希望将此检查推迟到副线程左右。

amqp后端,当您尝试.ready() AsyncResult时,它将解析。然后它意味着汇集分辨率。在某个地方,我已经读过redis后端没有合并的分辨率,但还没有挖掘它的代码。

我正在实现一个类似于ThreadPoolExecutor的CeleryExecutor,并且必须在周围进行.ready()检查以触发Future解析。