Il problema è finito per essere il fork di uwsgi.
Quando si lavora con più processi con un processo master, uwsgi inizializza l'applicazione nel processo master e quindi copia l'applicazione in ogni processo di lavoro. Il problema è che se apri una connessione al database durante l'inizializzazione dell'applicazione, hai più processi che condividono la stessa connessione, il che causa l'errore sopra.
La soluzione è impostare il lazy
opzione di configurazione per uwsgi, che forza un caricamento completo dell'applicazione in ogni processo:
lazy
Imposta la modalità pigra (carica le app in worker anziché in master).
Questa opzione potrebbe avere implicazioni sull'utilizzo della memoria poiché la semantica Copy-on-Write non può essere utilizzata. Quando lazy è abilitato, solo i lavoratori verranno ricaricati dai segnali di ricarica di uWSGI; il maestro rimarrà in vita. Pertanto, le modifiche alla configurazione di uWSGI non vengono rilevate durante il ricaricamento dal master.
C'è anche un lazy-apps
opzione:
lazy-apps
Carica le app in ogni lavoratore anziché nel master.
Questa opzione potrebbe avere implicazioni sull'utilizzo della memoria poiché la semantica Copy-on-Write non può essere utilizzata. A differenza del pigro, questo influisce solo sul modo in cui vengono caricate le applicazioni, non sul comportamento del master al ricaricamento.
Questa configurazione di uwsgi ha finito per funzionare per me:
[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