【问题标题】:Celery AsyncResult - Not working芹菜 AsyncResult - 不工作
【发布时间】:2018-04-09 13:16:46
【问题描述】:

我是 celery 的新手,但在简单的事情上却失败了:

后端和代理都为 RabbitMQ 配置

任务如下:

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

测试代码:

文件 1:

from tasks import add
from celery import uuid
task_id = uuid()
result = add.delay(7, 2)
task_id = result.task_id
print task_id
# output = 
         05f3f783-a538-45ed-89e3-c836a2623e8a
print result.get()
# output = 
          9

文件 2:

from tasks import add
from celery.result import AsyncResult

res = AsyncResult('05f3f783-a538-45ed-89e3-c836a2623e8a')
print res.state
# output =
         pending
print ('Result =  %s' %res.get())

我的理解是文件 2 应该检索值 success 和 9。

我已经安装了花:

这会报告成功,结果为 9。

帮助。这让我发疯了。

谢谢

【问题讨论】:

    标签: python celery celery-task


    【解决方案1】:

    也许您应该read the FineManual 并三思而后行?

    RPC 结果后端(RabbitMQ/QPid)

    RPC 结果后端 (rpc://) 很特殊,因为 它实际上并不存储状态,而是发送 它们作为消息。这是一个重要的区别,因为它意味着 结果只能被检索一次,并且只能由 启动任务。两个不同的进程不能等待同一个进程 结果。

    (...)

    消息默认是瞬态的(非持久的),所以结果 如果代理重新启动,将消失。您可以配置结果 后端使用 result_persistent 发送持久消息 设置。

    【讨论】:

    • 你的正确。 rpc:// 有这个操作。我没有使用 rpc://。我正在使用 ampq。所以结果应该是消息Q?没有提及使用 ampq 作为支持时会发生什么。
    • rpc 是 celery 4.x 中唯一的 RabbitMQ 后端,参见 docs.celeryproject.org/en/latest/userguide/…。如果您使用的是旧版本 (3.x),请参阅相关文档:docs.celeryproject.org/en/3.1/… - FWIW 似乎也不会保留结果。
    • 长话短说:如果要持久化结果,请使用持久化结果后端。同样,FWIW,“PENDING”状态实际上意味着“UNKNOWN”状态(根据作者自己的话),因此为您知道已执行的任务获取 PENDING 状态意味着结果无处可去在结果后端找到。
    • 这不是“获得结果的唯一方法”,但这是确保您的结果在后端重新启动后仍然存在并且可以从另一个进程访问的唯一方法。是的,redis 工作正常,可能是大多数情况下最好的“默认”后端选择(易于设置、低开销、可以保留结果,甚至可以自行清理旧结果)。
    • 取决于你的需求和约束,但是celery确实是设计成以RabbitMQ代理/Redis后端为主要目标,当你开始担心性能时,RabbitMQ有很多非常有用的特性,鲁棒性和可扩展性。请记住,RabbitMQ 被设计为异步分布式消息队列,redis 被设计为高效的内存(具有持久性选项)键:值数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2018-07-05
    • 1970-01-01
    • 2015-06-01
    • 2018-09-09
    • 2021-08-21
    • 2021-07-12
    相关资源
    最近更新 更多