启动芹菜工人抛出“无属性'worker_state_db'”

Posted

技术标签:

【中文标题】启动芹菜工人抛出“无属性\'worker_state_db\'”【英文标题】:Start celery worker throws "no attribute 'worker_state_db'"启动芹菜工人抛出“无属性'worker_state_db'” 【发布时间】:2017-04-16 09:24:16 【问题描述】:

当我尝试在 Django 应用中启动 celery worker 时:

celery -A myApp worker -l info

我收到以下错误:

File "/home/alexander/.pyenv/versions/3.5.1/envs/myApp/lib/python3.5/site-packages/celery/utils/collections.py", line 134, in __getattr__
    type(self).__name__, k))

    AttributeError: 'Settings' object has no attribute 'worker_state_db'

如果你知道如何解决它,请写下你的想法!

【问题讨论】:

【参考方案1】:

当我在 settings.py 中加载的 config.json 中缺少一个键时,我遇到了同样的错误(基本上是 settings.py 中缺少的键)。

错误文本完全不相关。 希望对您有所帮助!

【讨论】:

【参考方案2】:

在尝试使用 dockerized django 项目配置 celery 时,我一遍又一遍地得到了这个。解决方案是在 docker-compose.yaml 中包含env_file

  celery:
    ...
    env_file: .env

【讨论】:

这很好用;我假设如果您有不同的服务,那么它们一定不共享相同的环境?【参考方案3】:

我想补充两点:

    当您从任何配置文件加载设置时也是如此,而不是本质上 django 的。这个问题纯粹与芹菜有关。

    关于这个神秘错误的起源的一些解释:

worker_state_db 是具有默认值的设置,因此您不必手动设置它。引发异常是因为 Settings 只是空的并且没有任何值,即使是默认值。也就是说,我们没有加载默认配置。在 Celery 中,解析异常(导致问题的原始异常)在启动工作程序时不会传播到 stderr。因此,您会收到一条消息,但它并没有告诉您任何可能的解决方案。

如何解决? 例如,如果您有 celeryconfig.py 放置您的 celery 应用程序模块并从那里通过以下方式加载设置:

app.config_from_object('path.to.your.celery.module.celeryconfig')

检查您的整个 celeryconfig.py 文件是否有任何可能崩溃或导致解析器崩溃的内容(不兼容的设置值?)。

【讨论】:

对我来说,配置已加载,但我在 Celery 4.3.0 中仍然遇到此问题【参考方案4】:

如果在解析设置时引发异常,则会出现该错误。比如当我们通过环境变量设置 Django 的SECRET_KEY(或任何其他设置)时:

SECRET_KEY = os.environ['SECRET_KEY']

要解决问题,您可以切换回:

SECRET_KEY = "asdfasdfasdf"

或使用:

SECRET_KEY = os.environ.get('SECRET_KEY', '')

如果您在celery.py文件中注释我们以下行并重新启动worker,您也可以找到导致问题的设置:

app.config_from_object('django.conf:settings', namespace='CELERY')

【讨论】:

删除app.config_from_object... 行无法调试问题,但更改SECRET_KEY = os.environ... 效果很好。谢谢。 奇怪,上次我有一些变量在没有 get() 的情况下加载,我在评论该行后设法找到了每个变量。无论如何,最好检查所有设置并检查其中哪些加载了 os.environ['xxxxx'] 如果我需要将这些变量放在 os.enviro 中怎么办? @亚历山大 它们在 os 环境中。只是用不同的方法把它们弄出来

以上是关于启动芹菜工人抛出“无属性'worker_state_db'”的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅地重启芹菜工人?

从多处理开始芹菜工人

芹菜工人和一个命令击败负载

芹菜工人并发

如何使用芹菜工人将 django 项目部署到谷歌云?

芹菜工人 ImportError:没有名为“项目”的模块