我正在尝试在我的项目中使用 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 (具有相同的 celery 设置)时,它工作得很好。有人遇到过这个问题吗?
提前致谢!
尽管执行了 celery 任务(控制台日志),但从 celery 任务返回结果时我遇到了同样的问题。我发现,我在 django settings.py 中具有相同的设置
CELERY_RESULT_BACKEND = "redis"
,但我还在tasks.py中实例化了芹菜
celery = Celery('tasks', broker='redis://localhost')
- 我认为它会覆盖 settings.py 属性,因此它没有为我的用于存储结果的 celery 实例配置后端服务器。
我删除了这个并让 django 从 settings.py 获取 celery 属性,示例代码对我有用。
如果您只是运行来自 http://www.celeryproject.org/tutorials/first-steps-with-celery/ 的示例,则需要通过manage.py 运行控制台:
% python 管理.py shell
就我而言,问题是我将 CELERY_RESULT_BACKEND 参数传递给 celery 构造函数:
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'])
对于那些像我一样迫切寻求解决方案的人。
将此行放在
settings.py
脚本的末尾:
djcelery.setup_loader()
看起来 django-celery 不会在没有严格顺序的情况下考虑它自己的设置。
对于 2023 年遇到此问题的用户。如果您使用的是 Celery 5.0 或更高版本,请在设置中设置 CELERY_RESULT_BACKEND = "rpc://"。如果您正在初始化 celery 应用程序,请使用以下代码:
Celery('your_project_name',
broker = 'amqp://guest:guest@localhost:5672//',
backend='rpc://',
include=['proj.tasks'])
控制台如何设置 django 环境才能获取设置。例如,在 PyCharm 中,您可以运行 django 控制台,其中一切都按预期运行。
请参阅AMQP后端设置以更好地理解
注意 AMQP 后端需要 RabbitMQ 1.1.0 或更高版本 结果自动过期。如果您运行的是旧版本 RabbitMQ 您应该像这样禁用结果过期:
CELERY_TASK_RESULT_EXPIRES = None
尝试将以下行添加到您的settings.py中:
CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours
就我而言,这显然是 celery 初始化期间出现的问题。我之前的配置是
if 'APP_ENV' in os.environ and os.environ['APP_ENV'] == 'dev':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "master.settings.local")
app = Celery('master', namespace='CELERY')
但是,我更改为以下以使其正常工作
app = Celery('master')
if 'APP_ENV' in os.environ and os.environ['APP_ENV'] == 'dev':
app.config_from_object("master.settings.local", namespace='CELERY')
此外,我的 django 设置现在看起来像这样
CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL')
CELERY_BAKEND_URL = os.getenv('CELERY_BAKEND_URL')
CELERY_RESULT_BACKEND=os.getenv('CELERY_BAKEND_URL')
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
注意,我添加了 CELERY_RESULT_BACKEND。希望这会节省别人的时间。