2010-06-14 5 views
5

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

मेरे पास क्लाइंट एक सेवा प्रसंस्करण डेटाबेस रिकॉर्ड के रूप में चल रहा है। इनमें से प्रत्येक रिकॉर्ड में बाहरी एफ़टीपी साइटों को कनेक्शन जानकारी होती है [मूल रूप से यह फ़ाइलों को स्थानांतरित करने की कतार है]। उनमें से बहुत सारे एक ही मेजबान हैं, बस अलग-अलग फाइलों को ले जा रहे हैं। इसलिए, मैं मेजबान द्वारा उन्हें एक साथ समूहीकृत कर रहा हूं। मैं प्रति होस्ट एक नया धागा बनाने में सक्षम होना चाहता हूँ। ट्रांसफर खत्म होने पर मुझे वास्तव में परवाह नहीं है, उन्हें केवल सभी काम करने की ज़रूरत है (या करने का प्रयास करें) उन्हें सौंपा गया था, और फिर समाप्त होने के बाद समाप्त हो गया, प्रक्रिया में उपयोग किए गए सभी संसाधनों को साफ करना।

मुझे उम्मीद है कि स्थापित होने के लिए 10-25 से अधिक कनेक्शन नहीं हैं। एक बार हस्तांतरण कतार खाली हो जाने के बाद, कार्यक्रम तब तक प्रतीक्षा करेगा जब तक कि कतार में रिकॉर्ड्स न हों।

क्या थ्रेडपूल इस के लिए एक अच्छा उम्मीदवार है या क्या मुझे एक अलग दृष्टिकोण का उपयोग करना चाहिए?

संपादित करें: अधिकांश भाग के लिए, यह सर्वर पर चलने वाला एकमात्र महत्वपूर्ण कस्टम एप्लिकेशन है।

उत्तर

2

जो आपने वर्णन किया है, उससे ऐसा लगता है कि थ्रेडपूल एक अच्छा फिट होगा।

मुद्दे:

  1. एक ThreadPool धागे शटडाउन होने पर जिंदा अपनी प्रक्रिया शामिल नहीं होंगे। सुनिश्चित करें कि वह व्यवहार है जो आप चाहते हैं।

  2. पुरानी पठन में, लंबे समय से चलने वाले कार्यों के साथ थ्रेडपूल बांधना जब ऐप इनकंपिंग कनेक्शन (जैसे वेब ऐप) पर इंतजार कर रहा हो तो खराब हो सकता है। हालांकि, ऐसा लगता है कि आपके पास एक समर्पित विंडोज सेवा चल रही है, इसलिए मुझे नहीं लगता कि यह एक मुद्दा है।

  3. सिर्फ इसलिए कि आप थ्रेड पूल में 10 नौकरियां फेंकते हैं इसका मतलब यह नहीं है कि यह तुरंत काम करने के लिए 10 धागे प्रेषित करेगा - आप निर्णय ले रहे हैं कि नेट और ओ/एस के लिए कितने धागे का उपयोग करना है ।

+0

+1 आपके सभी तर्कों से सहमत हैं, थ्रेडपूल एक अच्छा फिट है। – Walter

5

नहीं, थ्रेड पूल उचित नहीं है। थ्रेड पूल वास्तव में "छोटे कार्यों के लिए डिज़ाइन किया गया है जिनके लिए पृष्ठभूमि प्रसंस्करण की आवश्यकता होती है", क्योंकि ढांचा थ्रेड पूल धागे की उपलब्धता पर निर्भर करता है, और लंबी चलने वाली प्रक्रिया थ्रेड पूल को समाप्त कर सकती है।

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

MSDN विषय "The Managed Thread Pool" थ्रेड पूल धागे का उपयोग नहीं करने जब के लिए अच्छा दिशा निर्देशों प्रदान करता है:

कई परिदृश्य हैं जिसमें यह बना सकते हैं और धागा उपयोग करने के बजाय अपने खुद के धागे का प्रबंधन करने के लिए उपयुक्त है पूल धागे:

  • आपको अग्रभूमि धागा की आवश्यकता है।
  • आपको किसी विशेष प्राथमिकता के लिए थ्रेड की आवश्यकता होती है।
  • आपके पास ऐसे कार्य हैं जो थ्रेड को लंबे समय तक अवरुद्ध करते हैं। थ्रेड पूल की अधिकतम संख्या धागे है, इसलिए अवरुद्ध थ्रेड पूल थ्रेड की बड़ी संख्या कार्य शुरू करने से रोक सकती है।
  • आपको धागे को एक थ्रेडेड अपार्टमेंट में रखने की आवश्यकता है। सभी थ्रेडपूल धागे मल्टीथ्रेड वाले अपार्टमेंट में हैं।
  • आपको थ्रेड से जुड़े स्थिर पहचान की आवश्यकता है, या किसी कार्य को थ्रेड समर्पित करना है।
+0

आपके इनपुट के लिए धन्यवाद। क्या आप सुझाव देते हैं कि मैं सिर्फ थ्रेड बनाउंगा और उन्हें स्वयं प्रबंधित करूँ? –

+0

वास्तव में, धागे बनाना और उन्हें स्वयं प्रबंधित करना लंबी अवधि में जाने का तरीका है। थ्रेड को कताई की लागत एफ़टीपी स्थानांतरण समय की तुलना में महत्वहीन होगी, जो थ्रेड पूलिंग के प्रमुख लाभों में से एक को जोड़ती है (दूसरा सरलीकृत इंटरफ़ेस 'QueueUserWorkItem' ऑफ़र) है। –

1

एक ThreadPool अच्छा होगा क्योंकि यह आपको नौकरियों धागे को पंक्तिबद्ध की स्थापना, बजाय आरंभ और अलग-अलग धागे की सफाई के बारे में चिंता पर ध्यान केंद्रित करने की अनुमति देता है।

लेकिन आप इसे कैसे काम करना चाहते हैं? क्या आप मेजबान के लिए पूल में कई नौकरियों को कतार में जा रहे हैं, या क्या आप प्रत्येक मेजबान के लिए धागा ले रहे हैं जो अपनी कतार से नौकरियां पढ़ता है?

+0

कतार के लिए एक एकल डेटाबेस तालिका है, और मशीन नाम से एक कॉलम है। ग्राहक सेवा इसके स्वयं के मशीन नाम से पूछेगी। फिर, रिकॉर्ड के उस सबसेट से (मान लें कि 100 रिकॉर्ड लौटाए गए हैं), इसे होस्ट द्वारा समूहीकृत किया जाएगा (मान लीजिए कि यह 100 रिकॉर्ड्स के संग्रह से 4 अद्वितीय होस्ट लौटाए गए हैं)। तो, मैं उन मेजबानों में से प्रत्येक के लिए पूल में 4 थ्रेड शुरू करना चाहता हूं। –