2010-01-12 34 views
30

क्या कोई थ्रेड स्पॉन्गिंग बनाम थ्रेड पूलिंग के बीच कुछ तुलनात्मक बिंदु सूचीबद्ध कर सकता है, जो बेहतर है? कृपया एक संदर्भ कार्यान्वयन के रूप में .NET ढांचे पर विचार करें जो दोनों का समर्थन करता है।थ्रेड पूल बनाम थ्रेड स्पॉइंग

+0

"बेहतर" आपके प्लेटफॉर्म पर निर्भर करता है – skaffman

उत्तर

21

एक "पूल" में उपयोग किए जाने के लिए तैयार "धागे" की एक सूची होती है जबकि "स्पॉइंग" वास्तव में एक नया धागा बनाने का संदर्भ देती है।

"थ्रेड पूलिंग" की उपयोगिता "निचले समय-उपयोग में" है: निर्माण समय ओवरहेड से बचा जाता है।

"कौन सा बेहतर है" के संदर्भ में: यह निर्भर करता है। यदि निर्माण-समय ओवरहेड एक समस्या है थ्रेड-पूलिंग का उपयोग करें। यह वातावरण में एक आम समस्या है जहां बहुत से "अल्पकालिक कार्य" किए जाने की आवश्यकता है।


के रूप में अन्य लोगों द्वारा बताया, वहाँ थ्रेड-पूलिंग के लिए एक "प्रबंधन भूमि के ऊपर" है: इस कम से कम है अगर ठीक से लागू। जैसे पूल में धागे की संख्या सीमित करना मामूली है।

+1

एक कतार से कार्य चुनने और पूल से धागे को आवंटित करने की तुलना में एक नया धागा बनाने में एक बड़ा अंतर है (समय खपत के मामले में) विंडोज एक्सपी पर ओएस? – reonze

+0

मैंने उम्र में कोई गंभीर विंडोज प्रोग्रामिंग नहीं किया है, लेकिन मुझे पूरा यकीन है कि एक सूची (सरल ऑपरेशन) से उपलब्ध थ्रेड चुनना एक नया धागा पैदा करने से कहीं अधिक सस्ता है। – jldupont

+2

एक नए भौतिक धागे को फैलाने का मतलब कर्नेल मोड में एक संक्रमण होगा और कर्नेल संरचनाओं का एक गुच्छा स्थापित करेगा, इसलिए ओवरहेड अधिक होगा। लेकिन जैसा कि हम सभी जानते हैं कि आपको समय-समय पर अनुकूलन नहीं करना चाहिए।यदि आप केवल एक धागा बनाते हैं तो आप ओवरहेड को नोटिस नहीं करेंगे, अगर आप हजारों बना रहे हैं तो शायद आप करेंगे, लेकिन यह संभवतः थ्रेड कर रहे काम पर निर्भर करता है जो थ्रेड बनाने में लगने वाले समय को स्वैप कर सकता है। –

1

यह इस बात पर निर्भर करता है कि आप अन्य धागे पर निष्पादित करना चाहते हैं।

संक्षिप्त कार्य के लिए एक थ्रेड पूल का उपयोग करना बेहतर होता है, लंबे समय तक काम करने के लिए बेहतर हो सकता है क्योंकि यह अन्य कार्यों के लिए थ्रेड पूल को भूखा कर सकता है।

+1

प्रदर्शन विश्लेषण और लॉगिंग के लिए यह भी अच्छा है कि आप एक स्पॉन्डेड थ्रेड का नाम बदल सकते हैं और इस प्रकार प्रदर्शन विश्लेषण के लिए इसे आसान बना सकते हैं - यदि यह थ्रेडपूल है तो यह अनुमान लगाना मुश्किल हो जाता है कि कौन सा धागा किस कार्य से संबंधित है। – weismat

9

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

यदि आप अनुरोधों या किसी अन्य प्रकार के ट्रिगर के जवाब में धागे को बढ़ा रहे हैं, तो आप अपने सभी संसाधनों को कम करने का जोखिम चलाते हैं क्योंकि बनाए गए धागे की मात्रा को कैप करने के लिए कुछ भी नहीं है।

थ्रेड पूलिंग के लिए एक और लाभ पुन: उपयोग किया जाता है - प्रत्येक थ्रेड को हर बार एक नया धागा बनाने के बजाय विभिन्न कार्यों को संभालने के लिए और अधिक उपयोग किया जाता है।

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

+2

कोई कारण नहीं है कि आप स्प्रेड किए गए धागे की संख्या को कैप नहीं कर सके। –

+1

यह सच है, मैंने दावा नहीं किया कि यह असंभव था। लेकिन फिर पूल का उपयोग क्यों नहीं करते? – danben

+0

ठीक है, जब तक 'आम तौर पर' अपेक्षाकृत लंबा चलने वाला कार्य नहीं होता है (कुछ सेकंड में कुछ भी वास्तव में है)। (एबी) लंबे समय तक चलने वाले संचालन के लिए थ्रेडपूल का उपयोग करके डेडलॉक्स आदि के ग़लत रूपों का कारण बन सकता है। –

2

मुख्य अंतर यह है कि थ्रेडपूल थ्रेड के सेट को बनाए रखता है जो पहले से ही स्पून-अप और उपयोग के लिए उपलब्ध है, क्योंकि एक नया धागा शुरू करना महंगा प्रोसेसर-वार हो सकता है।

ध्यान दें कि यहां तक ​​कि थ्रेडपूल को भी "स्पॉन" धागे की आवश्यकता होती है ... यह आमतौर पर वर्कलोड पर निर्भर करता है - यदि बहुत सारे काम किए जाने हैं, तो एक अच्छा थ्रेडपूल लोड के आधार पर लोड को संभालने के लिए नए धागे को फैलाएगा विन्यास और सिस्टम संसाधन।

5

सभी आपके परिदृश्य पर निर्भर करता है। नए धागे बनाना संसाधन गहन और एक महंगी ऑपरेशन है। सबसे बहुत कम एसिंक्रोनस ऑपरेशंस (अधिकतम कुछ सेकंड से कम) थ्रेड पूल का उपयोग कर सकता है।

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

0

धागे बनाने/स्प्रेडिंग के लिए थोड़ी अतिरिक्त समय की आवश्यकता होती है, जहां थ्रेड पोल में पहले से ही बनाए गए धागे होते हैं जो उपयोग करने के लिए तैयार होते हैं।

4

मेरी भावना यह है कि आपको केवल आवश्यकतानुसार धागा बनाकर शुरू करना चाहिए ... यदि इसका प्रदर्शन ठीक है, तो आप कर चुके हैं। यदि किसी बिंदु पर, आप पाते हैं कि आपको थ्रेड सृजन के चारों ओर कम विलंबता की आवश्यकता है, तो आप आम तौर पर किसी भी चीज़ को तोड़ने के बिना थ्रेड पूल में छोड़ सकते हैं ...

25

थ्रेड पूल थ्रेड नियमित थ्रेड से बहुत सस्ता हैं, वे सिस्टम संसाधनों को पूल करते हैं धागे के लिए। लेकिन वे कहते हैं कि उन्हें अयोग्य कर सकते हैं सीमाओं की एक संख्या है:

  • आप एक ThreadPool धागे
  • कोई आसान तरीका है कि एक ThreadPool पूरा पता लगाने के लिए नहीं है गर्भपात नहीं कर सकते हैं, कोई Thread.Join()
  • वहाँ कोई आसान तरीका एक ThreadPool धागे
  • आप एक संदेश बॉक्स से परे एक ThreadPool धागे पर यूआई के किसी भी प्रकार प्रदर्शित नहीं कर सकता
  • एक ThreadPool धागा कुछ ही सेकंड से अधिक समय नहीं भागना चाहिए से अपवाद मार्शल करने के लिए है
  • एक धागा पूल धागा एक लंबे समय

बाद के दो बाधाओं ThreadPool अनुसूचक के एक पक्ष प्रभाव के लिए ब्लॉक नहीं चाहिए, यह कोर की संख्या अपने CPU उपलब्ध है को सक्रिय धागे की संख्या को सीमित करने की कोशिश करता। इससे लंबे समय तक देरी हो सकती है यदि आप अक्सर लंबे समय तक चलने वाले थ्रेड को शेड्यूल करते हैं।

कई अन्य थ्रेडपूल कार्यान्वयन में समान बाधाएं हैं, देना या लेना।

+2

यह उत्तर पूरी तरह से भाषा/मंच विशिष्ट है, लेकिन ऐसा माना जाता है कि यह एक सामान्य उत्तर होगा। चूंकि ओपी ने न तो मंच का उल्लेख किया और न ही भाषा: -1 –

+0

आपके साथ सहमत हैं। – Rubyrider

1

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

इसके विपरीत, यदि आपको केवल 2-3 धागे की आवश्यकता है और वे केवल एक बार बनाए जाएंगे, तो यह बेहतर होगा। ऐसा इसलिए है क्योंकि आप भविष्य के उपयोग के लिए मौजूदा धागे को कैशिंग से प्राप्त नहीं करते हैं, और आप अतिरिक्त धागे नहीं बना रहे हैं जिनका उपयोग नहीं किया जा सकता है।

0

मल्टी पिरोया निष्पादन के लिए या पता लगाने के लिए एक आसान तरीका से वापसी मान रही के साथ संयुक्त निष्पादन के लिए कि एक थ्रेडपूल पूरा हो गया है, जावा कॉलबेल का उपयोग किया जा सकता है।

अधिक जानकारी के लिए https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6 देखें।

संबंधित मुद्दे