Celery 4.2-Django RecursionError:超出最大递归深度

Ron*_*nso 10 django celery supervisord

我的__init__.py档案

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)
Run Code Online (Sandbox Code Playgroud)

我的celery.py档案

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Run Code Online (Sandbox Code Playgroud)

我的/etc/supervisor/conf.d/celery.conf文件:

[program:]
command=/home/user/venv/bin/celery -A myproject worker --loglevel=INFO
environment=PYTHONPATH=/home/user/project-folder
user=user
numprocs=1
autostart=true
autorestart=true
stdout_logfile=/home/user/logs/celery.log
stderr_logfile=/home/user/logs/celery.log
startssecs=10
stopwaitsecs = 600
stopasgroup=true
priority=100
Run Code Online (Sandbox Code Playgroud)

这是错误消息的最后一部分celery.log

File "/home/user/venv/lib/python3.6/site-packages/celery/loaders/base.py", line 131, in config_from_object
   self._conf = force_mapping(obj)
File "/home/user/venv/lib/python3.6/site-packages/celery/utils/collections.py", line 48, in force_mapping
   return DictAttribute(m) if not isinstance(m, Mapping) else m
File "/home/user/venv/lib/python3.6/abc.py", line 183, in __instancecheck__
   subclass = instance.__class__
File "/home/user/venv/lib/python3.6/site- packages/django/utils/functional.py", line 215, in inner
   self._setup()
File "/home/user/venv/lib/python3.6/site-packages/django/conf/__init__.py", line 43, in _setup
   self._wrapped = Settings(settings_module)
File "/home/user/venv/lib/python3.6/site-packages/django/conf/__init__.py", line 106, in __init__
   mod = importlib.import_module(self.SETTINGS_MODULE)
File "/home/user/venv/lib/python3.6/importlib/__init__.py", line 126, in import_module
   return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 951, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 894, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1157, in find_spec
File "<frozen importlib._bootstrap_external>", line 1129, in _get_spec
File "<frozen importlib._bootstrap_external>", line 1273, in find_spec
File "<frozen importlib._bootstrap_external>", line 1231, in _get_spec
File "<frozen importlib._bootstrap_external>", line 556, in 
spec_from_file_location
RecursionError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

不知道这个配置有什么问题吗?

小智 7

我也有同样的问题,当我删除下面这句话时

 app.config_from_object('django.conf:settings', namespace='CELERY')
Run Code Online (Sandbox Code Playgroud)

然后就可以了。所以我认为问题就是因为这个而发生的。也许我们应该指定这个函数的配置。


2ps*_*2ps 1

您不应该在__init__.py文件中导入 celery 应用程序。把它拿出来,它将修复你的无限启动导入循环。本质上,你的 celery 应用程序启动 django 设置模块初始化,该模块依次加载应用程序并尝试重新加载项目__init__.py文件,该项目文件加载你的 celery 文件,然后尝试重新加载设置文件,因为它还没有初始化。。。(你明白了)。