Vấn đề cuối cùng đã trở thành sự cố của uwsgi.
Khi làm việc với nhiều quy trình với một quy trình chính, uwsgi khởi tạo ứng dụng trong quy trình chính và sau đó sao chép ứng dụng sang từng quy trình công nhân. Vấn đề là nếu bạn mở một kết nối cơ sở dữ liệu khi khởi tạo ứng dụng của mình, sau đó bạn có nhiều quy trình chia sẻ cùng một kết nối, điều này gây ra lỗi ở trên.
Giải pháp là đặt lazy
tùy chọn cấu hình cho uwsgi, buộc phải tải toàn bộ ứng dụng trong mỗi quá trình:
lazy
Đặt chế độ lười (tải ứng dụng trong công nhân thay vì chính).
Tùy chọn này có thể có ý nghĩa sử dụng bộ nhớ vì không thể sử dụng ngữ nghĩa Copy-on-Write. Khi chế độ lười được bật, chỉ nhân viên mới được tải lại bằng tín hiệu tải lại của uWSGI; chủ sẽ vẫn sống. Do đó, các thay đổi cấu hình uWSGI không được tải lại bởi cái chính.
Ngoài ra còn có một lazy-apps
tùy chọn:
lazy-apps
Tải ứng dụng trong từng công nhân thay vì tải ứng dụng chính.
Tùy chọn này có thể có ý nghĩa sử dụng bộ nhớ vì không thể sử dụng ngữ nghĩa Copy-on-Write. Không giống như lười biếng, điều này chỉ ảnh hưởng đến cách các ứng dụng được tải, không ảnh hưởng đến hành vi của chính khi tải lại.
Cấu hình uwsgi này đã kết thúc hoạt động đối với tôi:
[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