【问题标题】:Celery 4.0.2 AsyncResult.then not workingCelery 4.0.2 AsyncResult.then 不工作
【发布时间】:2021-09-22 16:41:10
【问题描述】:

我想采用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,所以显然我不是唯一一个努力理解它应该如何工作的人。

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

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

谢谢

【问题讨论】:

    标签: python asynchronous promise celery celery-task


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您的第一个函数在调用 add 时打印 OK,而不是在您收到响应时...
      猜你喜欢
      • 2017-12-22
      • 2014-12-06
      • 2011-06-01
      • 2017-08-19
      • 2018-10-19
      • 2018-06-30
      • 2019-06-01
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多