启动celery worker时出现“no attribute 'worker_state_db'”错误

29

当我尝试在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'

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

5个回答

49

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

SECRET_KEY = os.environ['SECRET_KEY']

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

SECRET_KEY = "asdfasdfasdf"

或者使用:

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

如果您在celery.py文件中注释掉以下行并重新启动工作进程,还可以找到导致问题的设置:

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

2
删除行app.config_from_object...并不能解决问题,但是将SECRET_KEY = os.environ...更改后完美解决了。谢谢。 - Diego Jancic
1
上次我有一些变量没有使用get()加载,但是在注释掉那行代码后,我成功找到了它们。无论如何,最好检查所有设置并检查哪些是使用os.environ['xxxxx']加载的。 - Alexander Tyapkov
如果我需要将这些变量放在os.environ中怎么办?@alexander - Ajay Gupta
它们在操作系统环境中。只是获取它们的方法不同。 - Alexander Tyapkov
取消注释 app.config_from_object 可以帮助定位错误! - boatcoder

4

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

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


我遇到了这个问题,我的环境变量中有一个错别字,SECRETS_KEY 而不是 SECRET_KEY - Jonno_FTW

3
我想补充两件事情:
  1. 当你从任何配置文件中加载设置时,这也是正确的,不一定是django的。这个问题纯粹与Celery有关。

  2. 关于这个神秘错误的来源的一些解释:

worker_state_db是一个带有默认值的设置,因此您不必手动设置它。由于Settings只是空的,没有任何值,甚至没有默认值,所以会引发异常。也就是说,我们没有加载默认配置。在Celery中,解析时引发的异常(原始异常)在启动worker时没有传播到stderr。因此,您会收到一条没有任何可能解决方案的消息。

如何解决? 例如,如果你有一个名为celeryconfig.py的文件,在其中放置了你的celery应用程序模块,并通过以下方式从那里加载设置:

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

检查你的整个celeryconfig.py文件中是否存在可能会导致崩溃或解析器崩溃的内容(不兼容的设置值?)。


对我来说,配置肯定已经加载了,但我仍然在Celery 4.3.0中遇到了这个问题。 - Nishi

1

在尝试为docker化的Django项目配置celery时,我一直遇到这个问题。解决方法是在docker-compose.yaml中包括env_file

  celery:
    ...
    env_file: .env

这个很好用;我猜如果你有不同的服务,那么它们就不能共享相同的环境了? - alias51

0
Celery(通常情况下,不仅仅是Django的情况)尝试首先从其配置文件加载配置。
错误原因:
Celery加载配置文件,但是会引发任何异常。 Celery将显示此错误消息:
AttributeError: 'Settings' object has no attribute 'worker_state_db'

非常常见的例子:

假设您的配置文件在Celery配置文件中期望BROKER_PASSWORD环境变量。

broker_password = os.environ['BROKER_PASSWORD']

但是!!!

您忘记使环境变量BROKER_PASSWORD可用... 因此,此代码将引发KeyError

这会让Celery感到困惑,因此上面的消息将被显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接