यह मुद्दा उव्सगी के कांटेक्ट होने के कारण समाप्त हुआ।
मास्टर प्रक्रिया के साथ कई प्रक्रियाओं के साथ काम करते समय, uwsgi मास्टर प्रक्रिया में एप्लिकेशन को इनिशियलाइज़ करता है और फिर एप्लिकेशन को प्रत्येक कार्यकर्ता प्रक्रिया में कॉपी करता है। समस्या यह है कि यदि आप अपने एप्लिकेशन को प्रारंभ करते समय डेटाबेस कनेक्शन खोलते हैं, तो आपके पास एक ही कनेक्शन साझा करने वाली कई प्रक्रियाएं होती हैं, जो उपरोक्त त्रुटि का कारण बनती हैं।
समाधान lazy
. सेट करना है uwsgi के लिए कॉन्फ़िगरेशन विकल्प, जो प्रत्येक प्रक्रिया में एप्लिकेशन को पूरी तरह से लोड करने के लिए बाध्य करता है:
lazy
आलसी मोड सेट करें (मास्टर के बजाय कर्मचारियों में ऐप्स लोड करें)।
इस विकल्प में स्मृति उपयोग के निहितार्थ हो सकते हैं क्योंकि कॉपी-ऑन-राइट सेमेन्टिक्स का उपयोग नहीं किया जा सकता है। जब आलसी सक्षम होता है, तो यूडब्ल्यूएसजीआई के रीलोड सिग्नल द्वारा केवल श्रमिकों को पुनः लोड किया जाएगा; गुरु जीवित रहेगा। जैसे, 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