का उपयोग करके "बहुत सारे क्लाइंट" अपवाद से परहेज करते हुए मैं manage.py कमांड पर काम करता हूं जो रिमोट होस्ट की जांच के लिए लगभग 200 धागे बनाता है। मेरा डेटाबेस सेटअप मुझे 120 कनेक्शन का उपयोग करने की अनुमति देता है, इसलिए मुझे किसी प्रकार के पूलिंग का उपयोग करने की आवश्यकता है। मैं अलग धागा का उपयोग कर की कोशिश की है, इसथैंज में डीजेंगो ओआरएम का उपयोग करके और BoundedSemaphore
class Pool(Thread):
def __init__(self):
Thread.__init__(self)
self.semaphore = threading.BoundedSemaphore(10)
def give(self, trackers):
self.semaphore.acquire()
data = ... some ORM (not lazy, query triggered here) ...
self.semaphore.release()
return data
की तरह मैं हर चेक-धागा करने के लिए इस वस्तु का उदाहरण पारित लेकिन अभी भी "OperationalError: घातक: माफ करना, पहले से कई ग्राहकों" हो रही है पूल ऑब्जेक्ट के अंदर के बाद init-इंग 120 धागे मुझे उम्मीद है कि केवल 10 डेटाबेस कनेक्शन खोले जाएंगे और थ्रेड मुक्त सेमफोर स्लॉट के लिए इंतजार करेंगे। मैं "रिलीज()" पर टिप्पणी करके उस सेमफोर कार्यों को देख सकता हूं, उस मामले में केवल 10 धागे काम करेंगे और अन्य ऐप समाप्ति तक प्रतीक्षा करेंगे।
जितना मैं समझता हूं, हर धागा डेटाबेस के लिए नया कनेक्शन खोल रहा है भले ही वास्तविक कॉल अलग थ्रेड के अंदर है, लेकिन क्यों? क्या केवल एक धागे के अंदर सभी डेटाबेस प्रश्नों को करने का कोई तरीका है?
वास्तविक डीबी समस्या को खोजने के लिए, मुझे लगता है कि हमें अधिक एसक्यूएल कोड की आवश्यकता है। लेकिन, आप पूरे धागे को क्यों पूल नहीं करते हैं, इसलिए आप उस समय केवल 20-30 ही चलाते हैं? – KillianDS
नमस्ते, मेरी समस्या यह है कि django प्रत्येक थ्रेड के लिए कनेक्शन बनाता है जो किसी भी ओआरएम कोड को स्पर्श करता है, भले ही वास्तविक ओआरएम हेरफेर विभिन्न धागे में होता है। (मैंने पूल के उदाहरण देने के लिए कॉल को छोड़कर अन्य थ्रेड से सभी कोड हटाकर इसे चेक किया है)। तो मेरे मामले में डेटा देने के अलावा कोई एसक्यूएल नहीं है। जब तक मेरे पास कक्षा परीक्षक (थ्रेड): डीफ़ रन (स्वयं): self.getter.give (self.trackers) एक कनेक्शन बनाया जा रहा है (ट्रैकर्स यहां स्ट्रिंग की एक सूची है)। और 120 कनेक्शन की सीमा तक पहुंचने के बाद मेरा डेटाबेस अपवाद देना शुरू कर देता है। – Riz
बीटीडब्ल्यू, मैं इस समस्या को एक तरह से हल करने में सक्षम था - प्रत्येक डीबी अनुरोध के बाद मैन्युअल रूप से कनेक्शन बंद करके, प्रदर्शन स्वीकार्य है, लेकिन मैं अभी भी इस समस्या की जड़ के बारे में उत्सुक हूं। – Riz