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 文件中启动gunicorncelery。 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:超出最大递归深度的主要内容,如果未能解决你的问题,请参考以下文章

celery介绍

celery简单使用

celery 未处理的 celery 任务

celery 设置多少时间后运行

Celery框架的基本使用与介绍

使用celery遇到的坑