Celery AsyncResult 始终为 PENDING

22 投票
3 回答
11569 浏览
提问于 2025-04-18 15:10

我正在做一个演示,代码很简单:

# The Config
class Config:
    BROKER_URL = 'redis://127.0.0.1:6379/0'
    CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
    CELERY_ACCEPT_CONTENT = ['application/json']

# The Task
@celery_app.task()
def add(x, y):
    return x + y

要启动工作者:

$ celery -A appl.task.celery_app worker --loglevel=info -broker=redis://localhost:6379/0

 -------------- celery@ALBERTATMP v3.1.13 (Cipater)
 ---- **** ----- 
 --- * ***  * -- Linux-3.2.0-4-amd64-x86_64-with-debian-7.6
 -- * - **** --- 
 - ** ---------- [config]
 - ** ---------- .> app:         celery_test:0x293ffd0
 - ** ---------- .> transport:   redis://localhost:6379/0
 - ** ---------- .> results:     disabled
 - *** --- * --- .> concurrency: 2 (prefork)
 -- ******* ---- 
 --- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery

要安排任务:

>>> from appl.task import add
>>> r = add.delay(1, 2)
>>> r.id
'c41d4e22-ccea-408f-b48f-52e3ddd6bd66'
>>> r.task_id
'c41d4e22-ccea-408f-b48f-52e3ddd6bd66'
>>> r.status
'PENDING'
>>> r.backend
<celery.backends.redis.RedisBackend object at 0x1f35b10>

然后工作者会执行这个任务:

[2014-07-29 17:54:37,356: INFO/MainProcess] Received task: appl.task.add[beeef023-c582-42e1-baf7-9e19d9de32a0]
[2014-07-29 17:54:37,358: INFO/MainProcess] Task appl.task.add[beeef023-c582-42e1-baf7-9e19d9de32a0] succeeded in 0.00108124599865s: 3 

但是结果一直是 PENDING(待处理):

>>> res = add.AsyncResult(r.id)
>>> res.status
'PENDING'

我试过官方的常见问题解答,但没有帮助。

>>> celery_app.conf['CELERY_IGNORE_RESULT']
False

我哪里做错了?谢谢!

3 个回答

-1

这个对我有效:

from celery.result import AsyncResult
celery_task_result = AsyncResult(task_id)
task_state = celery_task_result.state

而且 task_state 可以获取各种状态,比如:'FAILURE'(失败)、'SUCCESS'(成功)、'PENDING'(待处理)等等。

1
  1. 试着换一个消息中间件,比如用rabbitmq,然后再检查一下状态。

  2. 确保你的redis服务器正常运行,并且celery可以访问它。你可以在命令行输入以下命令:redis-cli,然后再输入keys *。如果你能看到一些和celery相关的键,那就说明没问题;如果看不到,那说明你的消息中间件可能有问题。

14

过了一段时间,我把这个分享给遇到类似问题的朋友们:

在你的截图中,你会看到结果是禁用的。

在这里输入图片描述

当你创建celery实例时,确保你输入的配置是正确的。

from celery import Celery,Task

# here im using an AMQP broker with a memcached backend to store the results
celery = Celery('task1',broker='amqp://guest:guest@127.0.0.1:5672//',backend='cache+memcached://127.0.0.1:11211/')

不知为什么,我总是很难通过配置文件来设置celery实例的参数,所以在创建时我会明确地传入broker和backend,就像上面那样。

现在你会看到结果正确地配置为memcached(在我的情况下 - 你可能是redis)。还要确保你的任务在任务列表中被正确识别(task1.add)。

在这里输入图片描述

如果你还是无法让它工作,启动celery时可以尝试使用调试选项,如下所示:

celery worker -A task1.celery -l debug

看看输出的信息中是否有什么问题。

在我的情况下,这解决了你的错误,结果被设置为成功,我能够通过r.get()获取到3。

撰写回答