Celery 4.2-Django RecursionError:超出最大递归深度
Posted
技术标签:
【中文标题】Celery 4.2-Django RecursionError:超出最大递归深度【英文标题】:Celery 4.2-Django RecursionError: maximum recursion depth exceeded 【发布时间】:2019-01-18 15:02:28 【问题描述】:我的__init__.py
文件
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ('celery_app',)
我的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()
我的/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
这是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
不知道这个配置有什么问题?
【问题讨论】:
如何运行这些命令? 我使用supervisor
在两个单独的conf
文件中启动gunicorn
和celery
。 Gunicorn 运行良好,但我的芹菜工人却不行。启动芹菜工人的命令是我celery.conf
文件中的第一行
你能确定你在 gunicorn 上的优先级不同吗?我认为首先应该是 gunicorn,然后是 celery
@JerinPeterGeorge 和@wdfc 这就是正在发生的事情。我也有我的gunicorn.conf
文件。当我运行sudo supervisorctl reread
然后sudo supervisorctl update
时,gunicorn 守护程序首先运行,然后它因 celery.conf 而失败,并显示上述消息
对你来说太晚了,但可能对其他人有帮助。确保在你的 gunicorn.service 中设置的环境变量也在 celery.service 中设置,并在尝试数小时后清理 pycache 中的所有旧文件。
【参考方案1】:
我也有同样的问题,当我删除下面这句话时
app.config_from_object('django.conf:settings', namespace='CELERY')
然后就可以了。所以我认为问题是因为这个而发生的。 也许我们应该指定这个函数的配置。
【讨论】:
哦,不好意思说句是app.config_from_object('django.conf:settings', namespace='CELERY'),不是app.auto... 以某种方式工作,但不知道为什么?也许,官方文件说有这条线。【参考方案2】:您不应该在 __init__.py
文件中导入您的 celery 应用程序。把它拿出来,它会修复你的无限启动导入循环。本质上,您的 celery 应用程序会启动 django 设置模块初始化,这反过来会加载应用程序并尝试重新加载项目 __init__.py
文件,该文件会加载您的 celery 文件,然后尝试重新加载设置文件,因为它尚未初始化转动 。 . . (你明白了)。
【讨论】:
我一直有同样的错误。我别无选择,我花了 2 周的时间把头撞到桌子上,我不得不做一个解决方法:def threader(task,*args): t = threading.Thread(target=task, args=args) t.daemon = True t.start()
。有了这个补丁,我调用了方法及其参数,这就是我的电子邮件内容。我将此函数放在我项目中的 utils.py 文件中【参考方案3】:
from django.conf import settings
app.config_from_object(settings, namespace='CELERY')
其实这个settings
进去吧。
【讨论】:
【参考方案4】:如果它对某人有帮助 - 我遇到了类似的问题,它是由 Celery
类的重写 on_configure
方法中的异常引起的。我猜任何阻止Celery._load_config
方法正常执行的东西都可能导致“超出最大递归深度”错误。
【讨论】:
以上是关于Celery 4.2-Django RecursionError:超出最大递归深度的主要内容,如果未能解决你的问题,请参考以下文章