Проблемът се оказа разклонение на uwsgi.
Когато работите с множество процеси с главен процес, uwsgi инициализира приложението в главния процес и след това копира приложението към всеки работен процес. Проблемът е, че ако отворите връзка с база данни, когато инициализирате приложението си, тогава имате няколко процеса, споделящи една и съща връзка, което причинява грешката по-горе.
Решението е да зададете lazy
опция за конфигурация за uwsgi, която принуждава пълно зареждане на приложението във всеки процес:
lazy
Задайте мързелив режим (зареждайте приложения в работни места вместо в master).
Тази опция може да има последици за използването на паметта, тъй като семантиката на копиране при запис не може да се използва. Когато е активиран мързелив, само работниците ще бъдат презаредени от сигналите за презареждане на uWSGI; господарят ще остане жив. Като такива промените в конфигурацията на uWSGI не се улавят при презареждане от главния.
Има и lazy-apps
опция:
lazy-apps
Зареждайте приложения във всеки работник вместо в главния.
Тази опция може да има последици за използването на паметта, тъй като семантиката на копиране при запис не може да се използва. За разлика от мързеливия, това засяга само начина, по който се зареждат приложенията, а не поведението на главния при презареждане.
Тази конфигурация на uwsgi свърши работа за мен:
[uwsgi]
socket = /tmp/my_app.sock
logto = /var/log/my_app.log
plugins = python3
virtualenv = /path/to/my/venv
pythonpath = /path/to/my/app
wsgi-file = /path/to/my/app/application.py
callable = app
max-requests = 1000
chmod-socket = 666
chown-socket = www-data:www-data
master = true
processes = 2
no-orphans = true
log-date = true
uid = www-data
gid = www-data
# the fix
lazy = true
lazy-apps = true