禁用Celery的Django调试功能

17 投票
3 回答
7617 浏览
提问于 2025-04-16 10:39

在Django中,是否可以只为某个特定的应用设置DEBUG=False?因为当调试模式开启时,Celery会出现一个已知的内存泄漏问题。我有一个开发服务器,我希望Celery作为服务运行时不启用调试,这样就不会出现内存泄漏,但我又希望我的Django应用的其他部分在测试时可以使用调试,这样可以显示错误信息。

3 个回答

1

根据asksol的回答(https://stackoverflow.com/a/4806384/3009897),结合sww314对该回答的评论,指出在Celery 4.x中,之前提到的方法不再有效。我们可以使用inspect模块来查看当前执行的堆栈,这样就能知道DEBUG设置是在哪个地方被访问的。

对我来说,下面的修改有效:

if DEBUG and 'celery' in inspect.stack()[-1][1]:
    DEBUG = False

这个修改假设最外层的调用框架中会包含字符串'celery'在相关的文件路径中。(检查DEBUG是为了确保如果这个代码在生产环境中使用时(那时候DEBUG应该设置为False),inspect就不会被调用。)

6

@asksol 提供的解决办法对我没用,我必须这样做:

if "celery" in sys.argv[0]:
    DEBUG = False

因为 sys.argv 看起来像这样 ['/path/to/celery', 'worker', '-A', 'app']

我使用的是 Python 3.6 和 Celery 4

38

Celery 并不是有内存泄漏,而是 Django 的工作方式导致的:

当 DEBUG 模式开启时,Django 会把每一条执行过的 SQL 语句都添加到 django.db.connection.queries 里,这样在长时间运行的程序中,这个列表会不断增大。

我想你可以尝试一些小技巧,比如:

if "celeryd" in sys.argv:
    DEBUG = False

撰写回答