मैं वर्तमान में व्यक्तिगत उपयोग के लिए एक मल्टीथ्रेड डेटाबेस कनेक्शन इंटरफ़ेस लागू करने का प्रयास कर रहा हूं। इसे 3 वर्गों का उपयोग करके लागू किया गया है

  • DatabaseManager हर कनेक्शन के लिए एक नया डेटाबेस थ्रेडिंग डेटाबेस डेटाबेस कंसेंट
  • Database क्यूथ्रेड से विरासत में मिली एक वस्तु, जिसका मतलब मुख्य धागे में चलता है और एक कार्यकर्ता वस्तु पर काम करने के लिए एक इंटरफ़ेस को उजागर करता है
  • DatabaseWorker कार्यकर्ता ऑब्जेक्ट जो एक डेटाबेस लूप में एक ईवेंट लूप चलाता है जो एक एकल डेटाबेस कनेक्शन का प्रबंधन करता है, प्रश्नों की प्रतीक्षा करता है और Qt के माध्यम से परिणाम प्रदान करता है: QueuedConnections (सिग्नल / स्लॉट)
  • जब कनेक्शन का उपयोग नहीं किया जाता है (close() विधि के लिए स्पष्ट कॉल), तो यह संबंधित ईवेंट लूप बंद हो जाता है और थ्रेड हटा दिया जाता है। इसका उद्देश्य थ्रेड निर्माण और विलोपन को कम से कम रखना है।

इस आर्किटेक्चर को सीमित संख्या में धागे (आमतौर पर 10 से कम कनेक्शन) के साथ अब तक बहुत सफलता मिली है। मेरी मुख्य समस्या यह है कि मुझे नहीं पता कि यह कैसे व्यवहार करेगा अगर मेरे पास 100+ कनेक्शन हैं, जिसका मतलब है कि एक आवेदन के लिए 100+ थ्रेड्स जो मेरे मुख्य प्रश्न हैं

क्या एक आवेदन काउंटर उत्पादक में बहुत धागा है? यदि मैं एक ही समय में 50/100/500/1000 कनेक्शन खोलता हूं तो क्या होगा? यदि मैं ऐसा करता हूं, तो I / O डेटाबेस संचालन को पूरा होने में बहुत समय लगने वाला है (यह पहली बार में इसके लिए डिज़ाइन नहीं किया गया है) लेकिन थ्रेड्स की संख्या के कारण उस अंतराल का कितना हिस्सा होता है?

1
Nyashes 2 पद 2015, 13:49

2 जवाब

सबसे बढ़िया उत्तर

अपने आप में धागों की संख्या बहुत बड़ी समस्या नहीं है। प्रत्येक व्यक्ति कुछ मेमोरी का उपयोग करता है लेकिन आधुनिक मशीनों के लिए कि ओवरहेड विशाल नहीं है।

मुख्य समस्या तब आती है जब वे सभी धागे एक ही बार में काम करने की कोशिश करना शुरू कर देते हैं, वे संसाधनों के लिए लड़ना शुरू कर देते हैं और आप एक धीमी परिणाम के साथ समाप्त हो सकते हैं, जिससे आप कम संख्या में काम कर रहे होशियार हो सकते हैं।

इस प्रकार की स्थिति के लिए एक थ्रेड पूल एक सामान्य समाधान है, जहाँ कार्यों को निष्पादित करने के लिए कतारबद्ध किया जाता है और आपके पास अपनी मशीन के लिए उपयुक्त थ्रेड्स के लिए एक थ्रेड पूल है (उदाहरण के लिए प्रति कोर एक धागा) जो कतार से आइटम को संसाधित करता है। । यदि आपके थ्रेड्स प्रतिक्रिया के इंतजार में बहुत समय व्यतीत करते हैं, तो अधिक थ्रेड को वारंट किया जा सकता है, यदि वे लगातार गणना कर रहे हैं, हालांकि तब अधिक जोड़ना वास्तव में अच्छी तरह से चीजों को धीमा कर सकता है।

प्रदर्शन को मापें और तदनुसार समायोजित करें :) प्रदर्शन पर काम करते समय "आंत महसूस" बहुत अविश्वसनीय है।

2
Tim B 2 पद 2015, 11:31

मैं कहता हूँ कि हाँ, यह काउंटर उत्पादक है। प्रत्येक थ्रेड अपने स्टैक स्थान के लिए स्मृति का एक महत्वपूर्ण हिस्सा का उपयोग करता है और यदि आपके पास केवल 6 कोर हैं तो आप समानांतर में किसी भी तरह से थ्रेड के 100s नहीं चला सकते हैं। इसके बजाय एक थ्रेड पूल का उपयोग करें, उदा। KF5 थ्रेड वीवर या क्यूटी समवर्ती के माध्यम से और आदर्श थ्रेड काउंट पर ध्यान दें।

0
milianw 2 पद 2015, 11:21