芹菜 4.0.2 AsyncResult.然后不起作用



我想采用文档中所示的承诺协议。那里提供的示例有效,但承诺是在工人端处理的。相反,我希望在客户端上收到通知。

这是我 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'))

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

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

我的理解正确吗?这是期望的行为吗?

感谢

根据后端的不同,分辨率的"检查"不会自动发生。您需要积极.ready().wait()。您可能希望将此检查推迟到侧螺纹左右。

在后端amqp,当您尝试.ready() AsyncResult 时,它将解析。然后,这意味着池化以解决问题。在某处,我读到redis后端在没有池化的情况下进行解析,但尚未深入研究其代码。

我正在实现一个类似于ThreadPoolExecutor的CeleryExecutor,并且不得不四处进行.ready()检查以触发未来决议。

刚从芹菜开始,所以我不知道为什么!!

def OK():
    print("OK")
add.delay(3, 5).then(OK())  # Works
add.delay(3, 5).then(lambda: print("OK"))  # Fails...

相关内容

  • 没有找到相关文章

最新更新