問題は結局uwsgiの分岐でした。
マスタープロセスで複数のプロセスを操作する場合、uwsgiはマスタープロセスでアプリケーションを初期化してから、アプリケーションを各ワーカープロセスにコピーします。問題は、アプリケーションの初期化時にデータベース接続を開くと、同じ接続を共有する複数のプロセスが存在するため、上記のエラーが発生することです。
解決策は、lazy
を設定することです uwsgiの構成オプション。これにより、各プロセスでアプリケーションが完全に読み込まれます。
lazy
レイジーモードを設定します(マスターではなくワーカーにアプリをロードします)。
コピーオンライトセマンティクスは使用できないため、このオプションはメモリ使用量に影響を与える可能性があります。レイジーが有効になっている場合、ワーカーのみが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