Celery AsyncResult is always PENDING
我正在演示,代码很简单:
1 2 3 4 5 6 7 8 9 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 |
要启动工作程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ 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 |
计划任务:
1 2 3 4 5 6 7 8 9 10 | >>> 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> |
然后,工作人员将执行任务:
1 2 | [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 |
但是结果仍然是
1 2 3 | >>> res = add.AsyncResult(r.id) >>> res.status 'PENDING' |
我已经尝试了官方常见问题解答。 但这没有帮助。
1 2 | >>> celery_app.conf['CELERY_IGNORE_RESULT'] False |
我做错什么了? 谢谢!
已经有一段时间了,但是将其留给其他遇到类似问题的人:
在屏幕截图中,您看到结果被禁用
实例化celery实例时,请确保您具有正确的配置输入
1 2 3 4 | 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实例的参数,因此在实例化过程中如上所示在代理和后端中显式传递了它们
现在,您将看到正确配置为内存缓存的结果(在我的实例中-应该在您的实例中为redis)。还要确保在任务列表中选择任务(task1.add)
如果仍然无法正常工作,请在启动celery时尝试使用以下调试选项
1 | celery worker -A task1.celery -l debug |
看看它发出的信息是否出了问题
就我而言,它修复了您的错误,结果设置为成功,并且我能够在
尝试将您的代理更改为其他内容(例如rabbitmq),然后再次检查状态。
确保您的Redis服务器已启动并且可用于celery。
redis-cli
keys *
并且您应该看到一些与芹菜相关的密钥,如果不是,则意味着您的经纪人存在问题
这对我有用:
1 2 3 | from celery.result import AsyncResult celery_task_result = AsyncResult(task_id) task_state = celery_task_result.state |
和