启动芹菜工人抛出“无属性'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'”的主要内容,如果未能解决你的问题,请参考以下文章