禁用Celery的Django调试功能
在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