2010-05-07 4 views
13

क्या एक कनेक्शन पूल लागू करने के लिए कोई ज्ञात एल्गोरिदम है? यदि ज्ञात एल्गोरिदम नहीं हैं और उनके व्यापार-बंद क्या हैं?
कनेक्शन पूल को डिज़ाइन और प्रोग्राम करते समय कौन से डिज़ाइन पैटर्न आम हैं?
क्या कोई कोड उदाहरण boost.asio का उपयोग कर कनेक्शन पूल को लागू करता है?
क्या स्थायी कनेक्शन (http नहीं) के लिए कनेक्शन पूल का उपयोग करना अच्छा विचार है?
कनेक्शन पूलिंग से संबंधित थ्रेडिंग कैसा है? आपको एक नए धागे की आवश्यकता कब होती है?कनेक्शन पूल कैसे प्रोग्राम करें?

+0

एक समय में एक प्रश्न अच्छा अभ्यास है। –

+0

वे सभी संबंधित हैं, क्या आप पसंद करेंगे कि मैं इन संबंधित प्रश्नों में से प्रत्येक के लिए एक प्रश्न के साथ स्टैक ओवरफ्लो बमबारी करता हूं? –

+0

मुझे लगता है कि मुद्दा यह है कि आपका प्रश्न लोगों को लगता है कि आपने इस विषय के बारे में कोई शोध नहीं किया है और आप सभी उत्तरों ('होमवर्क' प्रश्नों के समान) चाहते हैं। हालांकि पूछने का एक अवैध तरीका नहीं है, यह मेरी राय में लोगों के भाग लेने के लिए आसान नहीं है। –

उत्तर

16

आप एक शुद्ध धागा-पूलिंग पॉलिसी के लिए देख रहे हैं (हो सकता है एक कनेक्शन या किसी संसाधन हो) के दो आसान दृष्टिकोण अर्थात् हैं: -

  1. आधा सिंक/आधा Async मॉडल (आमतौर पर संदेश का उपयोग कर का उपयोग करते हुए जानकारी पास करने के लिए कतार)।

  2. नेता/अनुयायी मॉडल (आमतौर पर जानकारी पास करने के लिए अनुरोध पंक्तियों का उपयोग करके)।

पहले दृष्टिकोण इस प्रकार है: -

  • आप को धागे की एक पूल बनाने के लिए एक संसाधन संभाल। अक्सर यह आकार (धागे की संख्या) कॉन्फ़िगर करने योग्य होने की आवश्यकता है। इन धागे को कॉल करें 'श्रमिक'।
  • फिर आप एक मास्टर थ्रेड बनाते हैं जो कार्यकर्ता धागे पर काम भेज देगा। अनुप्रयोग प्रोग्राम एक संदेश मास्टर धागा करने के लिए रूप कार्य डिस्पैचिज।
  • मास्टर धागा पर एक चुने हुए कार्यकर्ता धागे के संदेश क्यू एक ही डालता है और कार्यकर्ता धागा पूल से खुद को दूर करता है। कार्यकर्ता थ्रेड को सिंक्रनाइज़ेशन की आवश्यकता है और निकालना।
  • के बाद कार्यकर्ता कार्य पूरा करता है, यह थ्रेड-पूल पर वापस आता है।

मास्टर धागा ही FCFS में कार्य यह हो जाता है उपभोग कर सकते हैं या एक ढंग प्राथमिकता के आधार पर। यह आपके कार्यान्वयन पर निर्भर करेगा।

दूसरे मॉडल (नेता/अनुयायियों) कुछ इस तरह चला जाता है: -

  • एक धागा पूल बनाएँ। प्रारंभ में सभी कर्मचारी हैं। फिर नेता का चयन करें, स्वचालित रूप से बाकी-सभी अनुयायियों बनें। ध्यान दें कि को चुनने नेता को सिंक्रनाइज़ किया जाना है।
  • एकल अनुरोध Q पर संसाधित होने के लिए सभी डेटा डालें।
  • थ्रेड-पूल लीडर डेक्यू कार्य। इसके तुरंत बाद नए नेता का चयन करता है और कार्य निष्पादित करना शुरू करता है।
  • नया नेता अगले कार्य को उठाता है।

अन्य दृष्टिकोण भी हो सकते हैं, लेकिन उपर्युक्त रूपरेखाएं सरल हैं जो अधिकांश उपयोग-मामलों के साथ काम करती हैं।

आधा सिंक/आधा Async प्रमुख कमजोरी: -

  • उच्चतर संदर्भ स्विचिंग, तुल्यकालन, और ओवरहेड को कॉपी डेटा।

नेता/Follwers प्रमुख कमजोरी: -

  • कार्यान्वयन जटिलता थ्रेड पूल में की नेता चुनाव।

अब आप अपने लिए अधिक सही दृष्टिकोण का निर्णय ले सकते हैं। एचटीएच,

+0

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

+2

उन सामान्य पैटर्नों के नाम को प्राप्त करने के बाद मैंने गुमराह किया और पाया: http://www.kircher-schwanninger.de/michael/publications/lf.pdf मैं इसे पढ़ूंगा और यह दिलचस्प लग रहा है। –

+2

@the_drow: नेता सिर्फ एक और धागा है, लेकिन इसे कार्य करना है। पूल में सभी धागे व्यस्त होने पर हमेशा एक नेता बनना पड़ता है, तो कार्य को नए नेता के लिए चुने जाने के अनुरोध में इंतजार करना पड़ता है। एक बार नेता होने के बाद यह कार्य का ख्याल रखेगा। फिर से यह अनुरोध क्यू एफसीएफएस या प्राथमिकता आधारित हो सकता है। जो लिंक आपको मिला वह वास्तव में सभ्य है, आप वहां दिए गए दृष्टिकोणों पर विचार कर सकते हैं। – Abhay