最近我遇到一个关于由gunicorn服务的django网站的问题,而worker_class是gevent。
PostgreSQL数据库经常抱怨连接太多,在django的settings.py中我将数据库CONN_MAX_AGE设置为6,因此django将在6秒内重用数据库连接。但我发现django没有重复使用它们。
经过一番挖掘后,我发现有人说枪炮的异步工人会引起这个问题:Persistent database connections with async workers on Django >= 1.6 fails
Don't use Gunicorn to host your Django sites on Heroku
但我猜这是正确的理由,但我不知道为什么。
是否有人可以从异步工作者的原则或者枪支的源代码中分析这个问题并解释一下?
在查看django db模块的源代码之后,我知道django在ConnectionHandler()。_ connections中保存数据库连接,这是一个theading.local(),并且如果它没有过时将重用它。因为theading.local(),所以它是线程分隔的。
但是我认为异步工作者异步处理请求并且在一个单独的线程中,所以我不知道为什么异步工作者会导致这个问题。
任何建议都会有所帮助。