我正在做一个演示,代码很简单:
# 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>
然后worker就会执行任务:
[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'
我已经尝试过官方的FAQ。但这并没有帮助。
>>> celery_app.conf['CELERY_IGNORE_RESULT']
False
我做错了什么?谢谢!
已经有一段时间了,但我把这个更多地留给其他遇到类似问题的人:
在屏幕截图中,您会看到结果已禁用
实例化 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:[email protected]:5672//',backend='cache+memcached://127.0.0.1:11211/')
由于某种原因,我总是无法通过配置文件获取参数化的 celery 实例,因此在实例化期间显式传入代理和后端,如上所示
现在您将看到正确配置为 memcached 的结果(在我的实例中 - 在您的实例中应该是 redis)。还要确保您的任务在任务列表中被选中(task1.add)
如果您仍然无法让它工作,请在启动 celery 时尝试使用如下调试选项
celery worker -A task1.celery -l debug
看看它输出的信息是否有问题
就我而言,它修复了您的错误,结果设置为成功,我能够在
r.get()
上恢复 3
尝试将您的代理更改为其他名称(例如rabbitmq)并再次检查状态。
确保您的 Redis 服务器已启动并且可供 celery 访问。
redis-cli
keys *
您应该会看到一些与 celery 相关的键,如果没有,则意味着您的经纪人存在问题我花了几个小时试图弄清楚
ignore_result=False
参数。也许会对某人有所帮助。
这对我有用:
from celery.result import AsyncResult
celery_task_result = AsyncResult(task_id)
task_state = celery_task_result.state
和
task_state
获得各种状态:'FAILURE'
、'SUCCESS'
、'PENDING'
等