我正在尝试在我的项目中使用django-celery
在settings.py中我有
CELERY_RESULT_BACKEND = "amqp"
服务器启动正常
python manage.py celeryd --setting=settings
但是如果我想从延迟的任务中访问结果,我会收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\celery\result.py", line 108, in ready
return self.status in self.backend.READY_STATES
File "C:\Python27\lib\site-packages\celery\result.py", line 196, in status
return self.state
File "C:\Python27\lib\site-packages\celery\result.py", line 191, in state
return self.backend.get_status(self.task_id)
File "C:\Python27\lib\site-packages\celery\backends\base.py", line 404, in _is
_disabled
raise NotImplementedError("No result backend configured. "
NotImplementedError: No result backend configured. Please see the documentation
for more information.
这很奇怪,因为当我刚刚运行celeryd(使用相同的芹菜设置)时,它的效果很好。有没有人遇到过这个问题?
提前致谢!
答案 0 :(得分:5)
虽然芹菜任务已执行(控制台日志),但从celery任务获取结果时遇到了同样的问题。我发现的是,我在django settings.py中有相同的设置CELERY_RESULT_BACKEND = "redis"
,但我还在tasks.py中实例化了芹菜。
celery = Celery('tasks', broker='redis://localhost')
- 我认为它会覆盖settings.py属性,因此它没有为我的celery实例配置后端服务器,后者用于存储结果。
我删除了这个,让django从settings.py获取芹菜获取属性,示例代码为我工作。
答案 1 :(得分:2)
对于那些急需寻找像我一样的解决方案的人。
将此行放在settings.py
脚本的末尾:
djcelery.setup_loader()
如果没有严格的订单, django-celery 似乎不会考虑它自己的设置。
答案 2 :(得分:1)
如果您只是从http://www.celeryproject.org/tutorials/first-steps-with-celery/运行示例,则需要通过manage.py运行控制台:
%python manage.py shell
答案 3 :(得分:0)
控制台必须如何设置django环境才能获取设置。例如,在PyCharm中,您可以运行django控制台,其中一切都按预期工作。
答案 4 :(得分:0)
有关更好的理解,请参阅AMQP BACKEND SETTINGS
注意AMQP后端需要RabbitMQ 1.1.0或更高版本 自动过期结果。如果您运行的是旧版本 RabbitMQ你应该禁用结果过期,如下所示:
CELERY_TASK_RESULT_EXPIRES = None
尝试将以下行添加到settings.py:
CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours
答案 5 :(得分:0)
就我而言,问题是我将CELERY_RESULT_BACKEND参数传递给芹菜构造函数:
Celery('proj',
broker = 'amqp://guest:guest@localhost:5672//',
CELERY_RESULT_BACKEND='amqp://',
include=['proj.tasks'])
解决方案是使用后端参数:
Celery('proj',
broker = 'amqp://guest:guest@localhost:5672//',
backend='amqp://',
include=['proj.tasks'])