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