Недавно я столкнулся с проблемой, связанной с веб-сайтом django, обслуживаемым gunicorn, а рабочий класс - gevent.
База данных PostgreSQL часто жалуется на слишком большое количество соединений. В django settings.py я установил для базы данных CONN_MAX_AGE значение 6, поэтому django повторно использует соединение с базой данных в течение 6 секунд. Но я обнаружил, что Django не использует их повторно.
после некоторого копания я обнаружил, что кто-то говорит, что асинхронный рабочий из gunicorn вызовет эту проблему:
Постоянные подключения к базе данных с асинхронными рабочими в Django> = 1.6 не удается
Не используйте Gunicorn для размещения своих сайтов Django на Heroku
Но я думаю, что это правильная причина, но я не знаю почему.
Кто-нибудь может проанализировать эту проблему из принципа асинхронного работника или исходного кода gunicorn и объяснить это?
После просмотра исходного кода модуля django db я знаю, что django сохранит соединение с базой данных в ConnectionHandler () ._ соединений, который является theading.local (), и будет использовать его, если оно не устарело. из-за theading.local (), поэтому он разделен на потоки.
Но я думаю, что асинхронный работник обрабатывает запрос асинхронно и находится в одном потоке, поэтому я не знаю, почему асинхронный работник может вызвать эту проблему.
любое предложение будет полезным.