最近我遇到了一个关于由gunicorn提供的django网站的问题,并且worker_class是gevent。
PostgreSQL数据库经常抱怨连接过多,在django的settings.py中我将数据库CONN_MAX_AGE设置为6,因此django将在6秒内重用数据库连接。但我发现 django 没有重用它们。
经过一番挖掘,我发现有人说gunicorn的异步工作者会导致这个问题:
Django >= 1.6 上与异步工作人员的持久数据库连接失败
不要使用 Gunicorn 在 Heroku 上托管 Django 站点
但我想这是正确的原因,但我不知道为什么。
有没有人可以从asyncworker的原理或者gunicorn的源代码来分析这个问题并解释一下?
在查看了django db模块的源代码后,我知道django将数据库连接保存在ConnectionHandler()._connections中,这是一个theading.local(),如果它没有过期,将重用它。因为theading.local(),所以它是线程分离的。
但我认为异步工作线程异步处理请求并且位于一个线程内,所以我不知道为什么异步工作线程会导致此问题。
任何建议都会有所帮助。