【问题标题】:django-celery: No result backend configureddjango-celery:没有配置结果后端
【发布时间】:2012-01-15 16:05:56
【问题描述】:

我正在尝试在我的项目中使用 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 设置)时,它工作得很好。有没有人遇到过这个问题?

提前致谢!

【问题讨论】:

    标签: django django-celery


    【解决方案1】:

    虽然 celery 任务已执行(控制台日志),但我在从 celery 任务中获取结果时遇到了同样的问题。我发现,我在 django settings.py 中有相同的设置 CELERY_RESULT_BACKEND = "redis",但我也在 tasks.py 中实例化了 celery

    celery = Celery('tasks', broker='redis://localhost') - 我想它会覆盖 settings.py 属性,因此它没有为用于存储结果的 celery 实例配置后端服务器。

    我删除了这个,让 django get celery 从 settings.py 获取属性,示例代码对我有用。

    【讨论】:

      【解决方案2】:

      如果您只是从 http://www.celeryproject.org/tutorials/first-steps-with-celery/ 运行示例,则需要通过 manage.py 运行控制台:

      % python manage.py shell

      【讨论】:

        【解决方案3】:

        对于那些像我一样拼命寻找解决方案的人。

        将此行放在settings.py 脚本的末尾:

        djcelery.setup_loader()
        

        看起来 django-celery 在没有严格顺序的情况下不会考虑自己的设置。

        【讨论】:

          【解决方案4】:

          就我而言,问题在于我将 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'])
          

          【讨论】:

            【解决方案5】:

            控制台必须如何设置 django 环境才能获取设置。例如,在 PyCharm 中,您可以运行 django 控制台,其中一切正常。

            【讨论】:

              【解决方案6】:

              请参阅AMQP BACKEND SETTINGS 以获得更好的理解

              注意 AMQP 后端需要 RabbitMQ 1.1.0 或更高版本才能 结果自动过期。如果您运行的是旧版本的 RabbitMQ 你应该像这样禁用结果过期: CELERY_TASK_RESULT_EXPIRES = None

              尝试将以下行添加到您的 settings.py:

              CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours

              【讨论】:

                猜你喜欢
                • 2017-04-10
                • 1970-01-01
                • 1970-01-01
                • 2018-02-09
                • 1970-01-01
                • 2019-08-29
                • 2017-10-05
                • 2017-05-28
                • 2018-09-11
                相关资源
                最近更新 更多