python - 如何从另一个进程中的任务获取任务信息/结果?
问题描述
我有这个tasks.py
:
from celery import Celery
import time
app = Celery('tasks', backend='rpc://', broker='amqp://localhost')
@app.task
def add(x, y):
print "Waiting for some time!"
time.sleep(5)
return x+y + 10
并使用此代码触发任务:
from tasks import add
import time
from celery.result import AsyncResult
r = add.delay(4, 4)
id = r.task_id
print "started task: "+id
newresult = AsyncResult(id)
print "ready? "+str(newresult.ready())
一切正常。任务被发送给 celery worker 并立即返回
[bf@localhost CeleryTest]$ python celerytest.py
started task: e73ad2ab-3ab6-457a-9185-199c4073f99d
ready? False
现在,我想从另一个 Python 脚本请求该任务的状态,所以我这样做:
>>> from celery.result import AsyncResult
>>> from tasks import add
>>> newresult = AsyncResult('e73ad2ab-3ab6-457a-9185-199c4073f99d')
>>> newresult.ready()
False
不知何故,这newresult
永远不会准备好,其结果是None
. 如何查询 Celery 以AsyncResult
从另一个进程返回有效值?
解决方案
我在后端摆弄了一下(将其更改为redis://
并且有效),在tasks.py
:
app = Celery('tasks', backend='redis://', broker='redis://localhost')
进一步研究我发现的文档:
RPC 结果后端 (rpc://) 很特殊,因为它实际上并不存储状态,而是将它们作为消息发送。这是一个重要的区别,因为它意味着结果只能检索一次,并且只能由启动任务的客户端检索。两个不同的进程不能等待相同的结果。
推荐阅读
- java - 针对可能包含单个字符的弱密码列表的密码验证器
- pandas - 通过比较同一id的多行中的多列来过滤行
- c# - SpotifyAPI-NET 添加范围控制台应用程序 c#
- python - 如何删除文件python中的一定数量的字节
- go - 无法使用我自己的登录 golang 的功能打印日志信息
- python - 如何使图像/图像在pygame中消失?
- python - .kv 文件不会在 python 中加载
- sql - Postgres 递归 LTREE 查找
- python - Django URL 被调用两次并崩溃视图
- javascript - SAPUI5 - oModel.create 不是函数