在Celery中通过id检索任务结果

Dem*_*ris 26 celery

我试图检查已完成的任务的结果. 这有效

from proj.tasks import add
res = add.delay(3,4)
res.get()
7
res.status
'SUCCESS'
res.id
'0d4b36e3-a503-45e4-9125-cfec0a7dca30'
Run Code Online (Sandbox Code Playgroud)

但我想从另一个应用程序运行它.所以我重新运行python shell并尝试:

from proj.tasks import add
res = add.AsyncResult('0d4b36e3-a503-45e4-9125-cfec0a7dca30')
res.status
'PENDING'
res.get() # Error
Run Code Online (Sandbox Code Playgroud)

如何检索结果?

Dem*_*ris 41

它的工作原理AsyncResult.(见这个答案)

所以首先创建任务:

from cel.tasks import add
res = add.delay(3,4)
res.status
'SUCCESS'
res.id
'432890aa-4f02-437d-aaca-1999b70efe8d'
Run Code Online (Sandbox Code Playgroud)

然后启动另一个python shell:

from celery.result import AsyncResult
from cel.tasks import app
res = AsyncResult('432890aa-4f02-437d-aaca-1999b70efe8d',app=app)
res.state
'SUCCESS'
res.get()
7
Run Code Online (Sandbox Code Playgroud)

  • @zerocog 当将不存在的 `id` 值传递给 `AsyncResult` 时,也会发生同样的情况,即 `app.AsyncResult("this-is-no-id").status` 是 `PENDING`,我觉得这有点令人恼火。例外会更有帮助。`ready()` 和 `failed()` 都返回 False。 (5认同)
  • 根据我的经验,我必须将任务放在 AsyncResult 之前。像这样: `my_task.AsyncResult('taskid...')` 没有其他对我有用。 (3认同)
  • 只需添加参考:http://stackoverflow.com/questions/5544611/retrieve-a-task-result-object-given-a-task-id-in-celery (2认同)
  • 我只是在玩弄这个例子,注意到任务清除队列后我的状态从“成功”变为“待处理”。参考http://docs.celeryproject.org/en/latest/userguide/tasks.html#std:state-PENDING 中的状态来认识到您的任务可能已完成,而现在task_id 已过期,产生未知状态。 (2认同)

tuo*_*mur 8

这是因为 RabbitMQ并未实际存储结果。如果您需要稍后获取结果的能力,请使用 redis 或 SQL 作为结果后端。