थ्रेड बनाम थ्रेडपूल


137

नए थ्रेड का उपयोग करने और थ्रेड पूल से थ्रेड का उपयोग करने में क्या अंतर है? प्रदर्शन के क्या लाभ हैं और मुझे स्पष्ट रूप से बनाए गए एक के बजाय पूल से एक धागे का उपयोग करने पर विचार क्यों करना चाहिए? मैं विशेष रूप से .NET के बारे में सोच रहा हूँ, लेकिन सामान्य उदाहरण ठीक हैं।

जवाबों:


110

थ्रेड पूल द्वारा लगातार और अपेक्षाकृत कम संचालन के लिए लाभ प्रदान करेगा

  • नए थ्रेड बनाने के बजाय पहले से बनाए गए थ्रेड्स का पुन: उपयोग करना (एक महंगी प्रक्रिया)
  • नए कार्य आइटमों के अनुरोध के फटने पर थ्रेड निर्माण की दर को रोकना (मेरा मानना ​​है कि यह केवल .NET 3.5 में है)

    • यदि आप 100 थ्रेड पूल कार्यों की कतार लगाते हैं, तो यह केवल उतने ही थ्रेड्स का उपयोग करेगा जितना इन अनुरोधों को पूरा करने के लिए पहले से ही बनाया गया है (उदाहरण के लिए 10 मानें)। थ्रेड पूल बार-बार चेक करेगा (मेरा मानना ​​है कि प्रत्येक 500ms 3.5 SP1 में) और यदि पंक्तिबद्ध कार्य हैं, तो यह एक नया धागा बना देगा। यदि आपके कार्य त्वरित हैं, तो नए थ्रेड्स की संख्या छोटी होगी और 10 या पुन: उपयोग करने वाले शॉर्ट टास्क के लिए थ्रेड्स 100 थ्रेड्स को सामने बनाने की तुलना में तेज़ होंगे।

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

    • जाँच यहाँ हुड के नीचे कैसे थ्रेड पूल कार्यों पर गहराई की जानकारी में और अधिक के लिए

यदि नया काम अपेक्षाकृत लंबे समय तक चलने वाला था (शायद एक या दो के आसपास, लेकिन यह विशिष्ट स्थिति पर निर्भर करता है) तो एक नया धागा बनाना अपने आप अधिक उपयुक्त होगा।

@Krzysztof - थ्रेड पूल थ्रेड्स बैकग्राउंड थ्रेड होते हैं जो मुख्य थ्रेड समाप्त होने पर बंद हो जाते हैं। मैन्युअल रूप से बनाए गए थ्रेड डिफ़ॉल्ट रूप से अग्रभूमि होते हैं (मुख्य थ्रेड के समाप्त होने के बाद भी चालू रहेंगे), लेकिन उन पर कॉल करने से पहले पृष्ठभूमि पर सेट किया जा सकता है।


5
केवल एक चीज जिसके बारे में मैं सोच रहा हूं, वह MSDN ( msdn.microsoft.com/en-us/library/1c9txz50.aspx ) का निम्न कथन है "एक बैकग्राउंड थ्रेड तभी निष्पादित होता है जब अग्रभूमि थ्रेड निष्पादन की संख्या प्रोसेसर की संख्या से छोटी होती है। । "। तो क्या इसका मतलब यह है कि जब विभाजित करने वाले कोर के बीच काम करते हैं तो अग्रगामी धागे को प्राथमिकता मिलती है?
cdiggins

1
➤ आप थ्रेड पूल से थ्रेड को रोक या बाधित नहीं कर सकते। A आप थ्रेड पूल से एक धागे में शामिल नहीं हो सकते। इसे प्राप्त करने के लिए, आपको कुछ अन्य तंत्रों का उपयोग करना होगा
ज़िनोव

14

.NET प्रबंधित थ्रेडपूल: -

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

अन्य थ्रेड पूल कार्यान्वयन मौजूद हैं जो लंबे समय तक चलने वाले संचालन के लिए अधिक उपयुक्त हो सकते हैं।

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

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


.NET में, क्या आप थ्रेड पूल के बिना पूरा होने वाले पोर्ट का उपयोग कर सकते हैं? मैं इस धारणा के तहत था कि एसिंक्स I / O विधियाँ ही एकमात्र तरीका था (.NET में) और वे थ्रेड पूल का उपयोग करते हैं
Karg

10

भी

new Thread().Start()

यदि आप अपना प्रोग्राम बंद कर देते हैं, तो फोरग्राउंड थ्रेड मर जाएगा। थ्रेडपूल थ्रेड बैकग्राउंड थ्रेड होते हैं जो ऐप बंद करते समय मर जाते हैं।


11
आप हमेशा पृष्ठभूमि पर एक थ्रेड सेट कर सकते हैं। वे डिफ़ॉल्ट रूप से अग्रभूमि हैं।
क्रिश एरिकसन

3
nemo: var t = new Thread (...); t.BackgroundThread = true; t.Start ();
रिकार्डो एमोरस

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

8

मैं इन के लिए सापेक्ष संसाधन उपयोग के बारे में उत्सुक था और मेरे 2012 के दोहरे कोर इंटेल i5 लैपटॉप का उपयोग करके एक बेंचमार्क चलाया। .net विंडोज़ पर 4.0 रिलीज़ बिल्ड 8. थ्रेड पूल ने औसतन 0.035ms लिया जहां से थ्रेड का औसत 5.06 लिया गया। एमएस। दूसरे शब्दों में, थ्रेड्स इन द पूल ने लगभग 300x तेज़ी से बड़ी संख्या में छोटे जीवित धागे शुरू किए। कम से कम परीक्षण रेंज (100-2000) धागे में, प्रति थ्रेड प्रति कुल समय बहुत स्थिर लग रहा था।

यह वह कोड है जिसे बेंचमार्क किया गया था:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

यहां छवि विवरण दर्ज करें


5
मुझे लगता है कि यह है क्योंकि
थ्रेडपुल ने

3

पहले वाले धागे के लिए यहां देखें:

मुझे .Net में थ्रेडपूल का उपयोग कब नहीं करना चाहिए?

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


1

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


1

यदि आपको थ्रेड्स की बहुत आवश्यकता है, तो आप संभवतः थ्रेडपूल का उपयोग करना चाहते हैं। वे धागे के निर्माण के ओवरहेड को बचाने के लिए फिर से उपयोग करते हैं।

यदि आपको बस कुछ करने के लिए एक धागे की आवश्यकता है, तो धागा शायद सबसे आसान है।


1

थ्रेडपूल थ्रेड्स के लिए प्राथमिक आवश्यकता छोटे छोटे कार्यों को संभालना है जो लगभग तुरंत पूरा होने की उम्मीद है। हार्डवेयर बाधा हैंडलर अक्सर एक स्टैकिंग संदर्भ में चलते हैं जो गैर-कर्नेल कोड के लिए उपयुक्त नहीं होगा, लेकिन एक हार्डवेयर इंटरप्ट हैंडलर यह खोज सकता है कि उपयोगकर्ता-मोड I / O पूर्ण कॉलबैक को जल्द से जल्द चलाया जाना चाहिए। इस तरह की चीज़ को चलाने के उद्देश्य से एक नया धागा बनाना बड़े पैमाने पर ओवरकिल होगा। कुछ पूर्व निर्मित थ्रेड्स जिन्हें I / O पूरा करने के लिए कॉलबैक या अन्य समान चीजें चलाने के लिए भेजा जा सकता है, बहुत अधिक कुशल हैं।

ऐसे थ्रेड्स का एक मुख्य पहलू यह है कि यदि I / O पूर्ण करने के तरीके हमेशा अनिवार्य रूप से तुरंत और कभी ब्लॉक नहीं होते हैं, और ऐसे थ्रेड्स की संख्या जो वर्तमान में इस तरह के तरीके चल रहे हैं, कम से कम प्रोसेसर की संख्या के बराबर है, एकमात्र तरीका किसी भी अन्य थ्रेड उपरोक्त विधियों में से एक से पहले चल सकता है यदि अन्य विधियों में से एक ब्लॉक या इसके निष्पादन समय में से एक सामान्य थ्रेडिंग-स्लाइस से अधिक होता है; यदि थ्रेड पूल का उपयोग उद्देश्य से किया जाता है, तो उनमें से कोई भी बहुत बार नहीं होना चाहिए।

यदि कोई विधि 100ms के भीतर से बाहर निकलने की उम्मीद नहीं कर सकती है या जब वह निष्पादन शुरू करती है, तो विधि को मुख्य थ्रेड पूल के अलावा अन्य माध्यमों से निष्पादित किया जाना चाहिए। यदि किसी के पास बहुत से कार्य हैं जो CPU गहन हैं, लेकिन ब्लॉक नहीं करेंगे, तो अनुप्रयोग थ्रेड्स (प्रति CPU कोर) जो कि "मुख्य" थ्रेडपूल से अलग है, का उपयोग करके उन्हें भेजने के लिए मददगार हो सकता है। गैर-अवरुद्ध सीपीयू-गहन कार्यों को चलाने पर कोर की तुलना में अधिक थ्रेड्स काउंटरप्रोडक्टिव होंगे। यदि, हालांकि, एक विधि को निष्पादित करने में एक या अधिक समय लगेगा, और अपना अधिकांश समय अवरुद्ध होगा, तो विधि को संभवतः एक समर्पित थ्रेड में चलाया जाना चाहिए, और निश्चित रूप से मुख्य-थ्रेडपूल थ्रेड में नहीं चलना चाहिए। यदि एक लंबे समय से चल रहे ऑपरेशन को I / O कॉलबैक जैसी किसी चीज़ से ट्रिगर किया जाना है,


0

सामान्य तौर पर (मैंने कभी भी .NET का उपयोग नहीं किया है), संसाधन प्रबंधन उद्देश्यों के लिए एक थ्रेड पूल का उपयोग किया जाएगा। यह बाधाओं को आपके सॉफ़्टवेयर में कॉन्फ़िगर करने की अनुमति देता है। यह प्रदर्शन कारणों से भी किया जा सकता है, क्योंकि नए धागों का निर्माण महंगा हो सकता है।

सिस्टम विशिष्ट कारण भी हो सकते हैं। जावा में (फिर से मुझे नहीं पता कि यह .NET पर लागू होता है), थ्रेड्स के प्रबंधक थ्रेड विशिष्ट चर लागू कर सकते हैं क्योंकि प्रत्येक थ्रेड को पूल से खींचा जाता है, और उन्हें लौटाया जाता है जब वे वापस आ जाते हैं (जैसे कुछ पास करने का सामान्य तरीका एक पहचान)।

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

इसका मतलब यह नहीं है कि आपको अपने स्वयं के धागे नहीं बनाने चाहिए, लेकिन ऐसी स्थितियां हैं जिनके तहत यह एक पूल का उपयोग करने के लिए समझ में आता है।


0

एक पूल का उपयोग करना एक अच्छा विचार है, यदि आप नहीं जानते हैं या नियंत्रित नहीं कर सकते हैं कि कितने थ्रेड बनाए जाएंगे।

किसी सूची नियंत्रण की स्थिति पर एक डेटाबेस से कुछ क्षेत्र को अद्यतन करने के लिए थ्रेड का उपयोग करने वाले फॉर्म के साथ एक समस्या है (फ्रीज से बचें)। मेरे उपयोगकर्ता को डेटाबेस से त्रुटि (एक्सेस के साथ बहुत अधिक संबंध) होने में 5 मिनट लगे क्योंकि वह सूची को बहुत अधिक बदल रहा था ...

मुझे पता है कि आधार की समस्या को हल करने का एक और तरीका है (पहुंच का उपयोग नहीं करना सहित) लेकिन पूलिंग एक अच्छी शुरुआत है।


0

धागा :

  1. थ्रेड बनाना, थ्रेड-पूल का उपयोग करने की तुलना में बहुत धीमा है।
  2. आप एक थ्रेड की प्राथमिकता बदल सकते हैं।
  3. संसाधनों से संबंधित प्रक्रिया में थ्रेड्स की अधिकतम संख्या।
  4. थ्रेड ओएस स्तर पर है और ओएस द्वारा नियंत्रित किया जाता है।
  5. थ्रेड का उपयोग करना एक बेहतर विकल्प है जब कार्य अपेक्षाकृत लंबे समय से चल रहा है

थ्रेड-पूल :

  1. थ्रेड-पूल पर थ्रेड चलाना सीधे थ्रेड बनाने से कहीं अधिक तेज है।
  2. आप थ्रेड-पूल के आधार पर थ्रेड रन की प्राथमिकता को नहीं बदल सकते।
  3. प्रति प्रक्रिया केवल एक थ्रेड-पूल है।
  4. थ्रेड-पूल को CLR द्वारा प्रबंधित किया जाता है।
  5. थ्रेड-पूल अल्पकालिक संचालन के लिए उपयोगी है।
  6. थ्रेड-थ्रेड में थ्रेड्स की संख्या एप्लिकेशन लोड से संबंधित है।
  7. TPL कार्य थ्रेड-पूल पर आधारित होते हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.