Masalahnya akhirnya menjadi forking uwsgi.
Saat bekerja dengan beberapa proses dengan proses master, uwsgi menginisialisasi aplikasi dalam proses master dan kemudian menyalin aplikasi ke setiap proses pekerja. Masalahnya adalah jika Anda membuka koneksi database saat menginisialisasi aplikasi, Anda kemudian memiliki beberapa proses yang berbagi koneksi yang sama, yang menyebabkan kesalahan di atas.
Solusinya adalah dengan mengatur lazy
opsi konfigurasi untuk uwsgi, yang memaksa pemuatan aplikasi secara lengkap di setiap proses:
lazy
Setel mode malas (muat aplikasi di pekerja, bukan master).
Opsi ini mungkin memiliki implikasi penggunaan memori karena semantik Copy-on-Write tidak dapat digunakan. Saat lazy diaktifkan, hanya pekerja yang akan dimuat ulang oleh sinyal isi ulang uWSGI; tuannya akan tetap hidup. Dengan demikian, perubahan konfigurasi uWSGI tidak diambil saat memuat ulang oleh master.
Ada juga lazy-apps
pilihan:
lazy-apps
Muat aplikasi di setiap pekerja, bukan master.
Opsi ini mungkin memiliki implikasi penggunaan memori karena semantik Copy-on-Write tidak dapat digunakan. Tidak seperti lazy, ini hanya memengaruhi cara aplikasi dimuat, bukan perilaku master saat memuat ulang.
Konfigurasi uwsgi ini akhirnya berfungsi untuk saya:
[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