C # में थ्रेड पूल का उपयोग कब करें? [बन्द है]


127

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

जवाबों:


47

यदि आपके पास बहुत सारे तार्किक कार्य हैं जिन्हें निरंतर प्रसंस्करण की आवश्यकता है और आप चाहते हैं कि समानांतर में किया जाए तो पूल + अनुसूचक का उपयोग करें।

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

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

आम तौर पर एक पूल में 2 थ्रेड्स प्रति प्रोसेसर (आजकल संभावित 4) होते हैं, हालाँकि आप अपनी इच्छानुसार थ्रेड की मात्रा सेट कर सकते हैं, यदि आप जानते हैं कि आपको कितने की आवश्यकता है।

संपादित करें: अपने स्वयं के थ्रेड बनाने का कारण संदर्भ परिवर्तन है, (यानी जब थ्रेड को स्वैप करने की आवश्यकता होती है और प्रक्रिया से बाहर, उनकी स्मृति के साथ)। बेकार संदर्भ परिवर्तन होने के बाद, जब आप अपने थ्रेड्स का उपयोग नहीं कर रहे हैं, तो कहें कि बस उन्हें छोड़ने के आसपास बैठें जैसा कि कोई कह सकता है, आपके कार्यक्रम के आधे प्रदर्शन को आसानी से कर सकता है (जैसे कि आपके पास 3 सोते हुए धागे और 2 सक्रिय धागे हैं)। इस प्रकार यदि थ्रेड डाउनलोड करने वाले लोग इंतजार कर रहे हैं तो वे सीपीयू के टन खा रहे हैं और आपके वास्तविक एप्लिकेशन के लिए कैश को ठंडा कर रहे हैं


2
ठीक है, लेकिन क्या आप बता सकते हैं कि यह कैसे है? उदाहरण के लिए, दूरस्थ सर्वर से डाउनलोड करने या डिस्क IO करने के लिए थ्रेड पूल का उपयोग करने का नकारात्मक पक्ष क्या है?

8
यदि कोई थ्रेड सिंक्रनाइज़ेशन ऑब्जेक्ट (ईवेंट, सेमीफोर, म्यूटेक्स, आदि) पर प्रतीक्षा कर रहा है, तो थ्रेड CPU का उपभोग नहीं करता है।
Brannon

7
जैसा कि ब्रानोन ने कहा, एक सामान्य मिथक यह है कि कई धागों का निर्माण प्रदर्शन को प्रभावित करता है। दरअसल, अप्रयुक्त धागे बहुत कम संसाधनों का उपभोग करते हैं। संदर्भ स्विच केवल उच्च मांग वाले सर्वरों में एक समस्या होने लगती है (इस मामले में, वैकल्पिक के लिए I / O पूर्ण पोर्ट देखें)।
एफडीसीएस्टल

12
क्या निष्क्रिय धागे प्रभाव प्रदर्शन करते हैं? यह इस बात पर निर्भर करता है कि वे कैसे प्रतीक्षा करते हैं। यदि अच्छी तरह से लिखा और एक सिंक्रनाइज़ेशन ऑब्जेक्ट पर प्रतीक्षा कर रहा है, तो उन्हें सीपीयू संसाधनों का उपभोग नहीं करना चाहिए। यदि एक लूप में इंतजार कर रहा है जो समय-समय पर परिणामों की जांच करने के लिए उठता है, तो यह सीपीयू को बर्बाद कर रहा है। हमेशा की तरह यह अच्छी कोडिंग के लिए नीचे आता है।
बिल

2
निष्क्रिय प्रबंधित थ्रेड्स अपने स्टैक के लिए मेमोरी खाते हैं। डिफ़ॉल्ट रूप से प्रति थ्रेड 1 MiB है। इसलिए सभी सूत्र काम करना बेहतर है।
वडियम स्टेशियाक

48

मेरा सुझाव है कि आप C # में किसी अन्य भाषा के समान कारणों के लिए थ्रेड पूल का उपयोग करें।

जब आप चलने वाले थ्रेड्स की संख्या को सीमित करना चाहते हैं या उन्हें बनाने और नष्ट करने का ओवरहेड नहीं चाहते हैं, तो थ्रेड पूल का उपयोग करें।

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

अन्यथा आप अपना समय बनाने और उन्हें नष्ट करने के बजाय केवल उस कार्य को करने में खर्च करते हैं जो वे करने का इरादा रखते हैं।


28

यहाँ .Net में थ्रेड पूल का एक अच्छा सारांश है: http://blogs.msdn.com/pedram/archive/2007/08/05/dedicated-thread-or-a-threadpool-thread.aspx

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


8
-1 लिंक के लिए। मुझे यकीन है कि यह एक अच्छी कड़ी है, लेकिन मुझे उम्मीद है कि SO आत्मनिर्भर होगा।
जॉन डेविस

26
@ stimpy77 - तो यह गलत उम्मीद है। SO कभी भी आत्मनिर्भर नहीं हो सकता है, क्योंकि यह न तो सभी प्रश्नों पर अंतिम अधिकार है, और न ही प्रत्येक विषय पर सभी गहन जानकारी को प्रत्येक और प्रत्येक SO उत्तर में दोहराया जा सकता है जो उस विषय को छूता है। (और मुझे नहीं लगता कि आपके पास जॉन स्कीट के हर एक जवाब को डाउनवोट करने के लिए पर्याप्त प्रतिष्ठा है, जिसमें एक आउटबाउंड लिंक है, अकेले सभी एसओ उपयोगकर्ताओं के सभी उत्तर जो आउटबाउंड लिंक :-) हैं)
Franci Penov

2
शायद मैं बहुत अधिक सफल हो रहा था, शायद मुझे स्पष्ट करना चाहिए। मैं लिंक के खिलाफ नहीं हूँ। मैं उन उत्तरों के खिलाफ हूं जिनमें केवल एक लिंक है। मुझे नहीं लगता कि यह कोई जवाब है। अब, यदि उत्तर का संक्षिप्त सारांश यह बताने के लिए पोस्ट किया गया है कि लिंक की गई सामग्री कैसे लागू होती है, तो यह स्वीकार्य होगा। इसके अलावा, मैं उसी समस्या का उत्तर ढूंढने के लिए यहां आया था और इस उत्तर ने मुझे परेशान कर दिया क्योंकि यह अभी तक एक और लिंक था जिसे मुझे किसी भी विचार पर क्लिक करना था क्योंकि यह विशिष्ट समस्या के संदर्भ में क्या कह सकता है। वैसे भी, जॉन स्कीट इस से संबंधित कहाँ है? और मैं क्यों परवाह करूं?
जॉन डेविस

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

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

14

मैं इस मुफ्त ई-पुस्तक को पढ़ने की सलाह देता हूं: थ्रेडिंग इन सी # जोसेफ अलबहारी द्वारा

कम से कम "प्रारंभ करना" अनुभाग पढ़ें। ई-बुक एक बेहतरीन परिचय प्रदान करती है और इसमें उन्नत थ्रेडिंग जानकारी का भी समावेश होता है।

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

  • टास्क समानांतर लाइब्रेरी (.NET फ्रेमवर्क 4.0)
  • ThreadPool.QueueUserWorkItem
  • अतुल्यकालिक प्रतिनिधि
  • BackgroundWorker

यह ई-बुक इन सभी की व्याख्या करती है और सलाह देती है कि उनका उपयोग कब करना है बनाम अपना खुद का धागा बनाना है।


8

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

अब, यदि उन घटकों में से प्रत्येक थ्रेड पूल में आइटम पंक्तिबद्ध कर रहे थे, तो आपके पास बहुत कम संदर्भ ओवरहेड स्विचिंग होगा।

थ्रेड पूल को आपके CPU (या CPU कोर) पर किए जा रहे कार्य को अधिकतम करने के लिए डिज़ाइन किया गया है। यही कारण है कि, डिफ़ॉल्ट रूप से, थ्रेड पूल प्रति प्रोसेसर कई थ्रेड को फैलाता है।

कुछ स्थितियाँ ऐसी हैं जहाँ आप थ्रेड पूल का उपयोग नहीं करना चाहेंगे। यदि आप I / O पर प्रतीक्षा कर रहे हैं, या किसी ईवेंट पर प्रतीक्षा कर रहे हैं, आदि तो आप उस थ्रेड पूल थ्रेड को टाई करते हैं और इसे किसी और द्वारा उपयोग नहीं किया जा सकता है। एक ही विचार लंबे समय तक चलने वाले कार्यों पर लागू होता है, हालांकि एक लंबे समय तक चलने वाले कार्य का गठन व्यक्तिपरक होता है।

पैक्स डियाब्लो एक अच्छा बिंदु भी बनाता है। धागे को कताई मुक्त नहीं है। इसमें समय लगता है और वे अपने स्टैक स्पेस के लिए अतिरिक्त मेमोरी का उपभोग करते हैं। थ्रेड पूल इस लागत को बढ़ाने के लिए थ्रेड्स का फिर से उपयोग करेगा।

नोट: आपने डेटा डाउनलोड करने या डिस्क I / O करने के लिए थ्रेड पूल थ्रेड का उपयोग करने के बारे में पूछा। आपको इसके लिए एक थ्रेड पूल थ्रेड का उपयोग नहीं करना चाहिए (ऊपर बताए गए कारणों के लिए)। इसके बजाय एसिंक्रोनस आई / ओ (उर्फ द बिगिनक्स और एंडएक्सएक्सएक्स तरीकों) का उपयोग करें। एक के लिए FileStreamहै कि हो सकता है BeginReadऔर EndRead। एक के लिए HttpWebRequestहो सकता है कि BeginGetResponseऔर EndGetResponse। वे उपयोग करने के लिए अधिक जटिल हैं, लेकिन वे बहु-थ्रेडेड आई / ओ प्रदर्शन करने का उचित तरीका हैं।


1
थ्रेडपूल एक चालाक स्वचालित है। "अगर इसकी कतार आधे से अधिक सेकंड तक स्थिर रहती है, तो यह थ्रेड पूल की क्षमता तक अधिक थ्रेड्स - एक हर आधे-सेकंड में बनाकर प्रतिक्रिया करता है" ( albahari.com/threading/#_Optimizing_the_T_Tread_Pool )। बिगिनएक्सएक्सएक्स-एंडएक्सएक्सएक्सएक्स के साथ लगभग अतुल्यकालिक संचालन थ्रेडपूल के माध्यम से उपयोग किया जाता है। इसलिए डेटा डाउनलोड करने के लिए थ्रेडपूल का उपयोग करना सामान्य है और अक्सर इसका उपयोग किया जाता है।
Artru

6

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


2
हमें इसका कठिन तरीका पता चला! ASP.Net का उपयोग करता है थ्रेडपूल दिखाई देता है और इसलिए हम इसका उपयोग उतना आक्रामक नहीं कर सकते जितना हम करना चाहते हैं।
noocyte

3

केवल छोटे कार्यों के लिए थ्रेड पूल का उपयोग करने का एक कारण यह है कि थ्रेड पूल थ्रेड्स की एक सीमित संख्या है। यदि कोई लंबे समय तक उपयोग किया जाता है तो यह उस धागे को अन्य कोड द्वारा उपयोग किए जाने से रोकता है। यदि ऐसा कई बार होता है तो थ्रेड पूल का उपयोग किया जा सकता है।

थ्रेड पूल का उपयोग करने के सूक्ष्म प्रभाव हो सकते हैं - कुछ .NET टाइमर थ्रेड पूल थ्रेड का उपयोग करते हैं और उदाहरण के लिए, आग नहीं लगेंगे।


2

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

एक आवेदन में जहां आप कई थ्रेड्स बना रहे हैं, थ्रेड्स बनाने का ओवरहेड पर्याप्त हो जाता है। थ्रेड पूल का उपयोग करके थ्रेड्स को एक बार बनाया जाता है और उनका पुन: उपयोग किया जाता है, इस प्रकार थ्रेड निर्माण ओवरहेड से बचा जाता है।

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


कृपया स्पष्ट करें कि क्या आपका मतलब है "थ्रेड पूल" या "थ्रेड पूल"। ये बहुत अलग चीजें हैं (कम से कम एमएस सीएलआर में)।
१२:०२ बजे bzlm

2

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

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

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

अब थोड़ा सा यथार्थवाद के लिए:

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

इसलिए जो सबसे महत्वपूर्ण हो सकता है, उस पर चर्चा करना आसान है जो कि कार्यक्रम के लिए आसान है।

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

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

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

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

नीचे ऐसे परीक्षण के परिणाम (i5 क्वाड कोर 16 जीबी रैम के साथ) दिए गए हैं, जो प्रत्येक 30 सेकंड को चलाने के लिए देते हैं। निष्पादित कोड एक एसएसडी ड्राइव पर सरल फ़ाइल I / O निष्पादित करता है।

परीक्षण के परिणाम


1
FYI करें, यह उल्लेख करना भूल गए कि कार्य और .NET थ्रेड्स .NET के भीतर संगणित सिम्युलेटेड हैं और प्रबंधन के साथ .NET में OS नहीं है - बाद में समवर्ती निष्पादन को प्रबंधित करने में बहुत अधिक कुशल है। मैं कई चीजों के लिए कार्य का उपयोग करता हूं, लेकिन मैं भारी निष्पादन के लिए एक ओएस थ्रेड का उपयोग करता हूं। एमएस का दावा है कि टास्क और .NET थ्रेड्स बेहतर हैं, लेकिन वे .NET ऐप्स के बीच कंफर्ट को बैलेंस करने के लिए सामान्य हैं। एक सर्वर ऐप हालांकि सबसे अच्छा प्रदर्शन करेगा जो ओएस को संभाल सकेगा।

अपने कस्टम थ्रेडपूल के कार्यान्वयन को देखना पसंद करेंगे। अच्छा लिखो!
फ्रांसिस

मुझे आपके परीक्षा परिणाम समझ में नहीं आए। दास "यूनिट रैन" का क्या अर्थ है? आप 512 धागे के साथ 34 टैक की तुलना करते हैं? क्या आप इसे स्पष्ट करेंगे?
एल्म्यू

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


1

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

आप सभी कार्यों को एक थ्रेड पूल में जोड़ सकते हैं और अधिकतम संख्या में थ्रेड्स निर्दिष्ट कर सकते हैं जो एक निश्चित समय पर चल सकते हैं।

की जाँच करें इस MSDN पर पेज: http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx


ठीक है, मैं अपने अन्य प्रश्न में इस संबंध का अनुमान लगाता हूं। आप कैसे जानते हैं कि किसी भी समय आपके पास कितने उपलब्ध धागे हैं?

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

1

हमेशा एक थ्रेड पूल का उपयोग करें यदि आप कर सकते हैं, तो संभव अमूर्त के उच्चतम स्तर पर काम करें। थ्रेड पूल आपके लिए धागे बनाना और नष्ट करना छिपाते हैं, यह आमतौर पर एक अच्छी बात है!


1

ज्यादातर बार आप पूल का उपयोग कर सकते हैं क्योंकि आप धागा बनाने की महंगी प्रक्रिया से बचते हैं।

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


1

पृष्ठभूमि कार्यकर्ता की जांच करना न भूलें।

मैं बहुत सारी स्थितियों के लिए खोजता हूं, यह मुझे भारी भार उठाने के बिना सिर्फ वही देता है जो मैं चाहता हूं।

चीयर्स।


जब यह एक सरल ऐप है जो चल रहा है और आपके पास एक और काम करना है, तो इस कोड को करना बहुत आसान है। हालांकि आपने लिंक प्रदान नहीं किया है: विनिर्देश और ट्यूटोरियल
15

0

मैं आमतौर पर थ्रेडपूल का उपयोग करता हूं जब भी मुझे किसी दूसरे धागे पर कुछ करने की आवश्यकता होती है और जब यह चलता है या समाप्त होता है तो वास्तव में परवाह नहीं करता है। लॉगिंग या हो सकता है कि किसी फ़ाइल को डाउनलोड करने की पृष्ठभूमि भी हो (हालांकि उस एस्कि-स्टाइल को करने के बेहतर तरीके हैं)। जब मुझे अधिक नियंत्रण की आवश्यकता होती है, तो मैं अपने स्वयं के धागे का उपयोग करता हूं। इसके अलावा, मैंने जो पाया है वह "कमांड ऑब्जेक्ट्स" को स्टोर करने के लिए थ्रेडसेफ़ क्यू (अपने खुद के हैक) का उपयोग कर रहा है, अच्छा है जब मेरे पास कई कमांड हैं जिन्हें मुझे> 1 थ्रेड पर काम करने की आवश्यकता है। तो आप एक Xml फ़ाइल को विभाजित कर सकते हैं और प्रत्येक तत्व को एक कतार में रख सकते हैं और फिर इन तत्वों पर कुछ प्रसंस्करण करने के लिए कई सूत्र काम कर सकते हैं। मैंने uni (VB.net!) में इस तरह का एक कतार रास्ता लिखा है जिसे मैंने C # में बदल दिया है। मैंने बिना किसी विशेष कारण के इसे नीचे शामिल किया है (इस कोड में कुछ त्रुटियां हो सकती हैं)।

using System.Collections.Generic;
using System.Threading;

namespace ThreadSafeQueue {
    public class ThreadSafeQueue<T> {
        private Queue<T> _queue;

        public ThreadSafeQueue() {
            _queue = new Queue<T>();
        }

        public void EnqueueSafe(T item) {
            lock ( this ) {
                _queue.Enqueue(item);
                if ( _queue.Count >= 1 )
                    Monitor.Pulse(this);
            }
        }

        public T DequeueSafe() {
            lock ( this ) {
                while ( _queue.Count <= 0 )
                    Monitor.Wait(this);

                return this.DeEnqueueUnblock();

            }
        }

        private T DeEnqueueUnblock() {
            return _queue.Dequeue();
        }
    }
}

इस दृष्टिकोण के साथ कुछ समस्याएं: - कॉल्स टू डीक्यूसेफ़ () तब तक प्रतीक्षा करेगी जब तक कोई आइटम एन्क्लेस्डसेफ़ () नहीं होगा। मॉनीटर में से एक का उपयोग करने पर विचार करें। वॉइट () ओवरलोड एक टाइमआउट निर्दिष्ट करता है। - इस पर ताला लगाना सर्वोत्तम प्रथाओं के अनुसार नहीं है, बल्कि एक पठनीय वस्तु क्षेत्र बनाना है। - भले ही Monitor.Pulse () हल्का है, यह कहते हुए कि जब कतार में केवल 1 आइटम होता है तो अधिक कुशल होगा। - DeEnqueueUnblock () को अधिमानतः कतार की जाँच करनी चाहिए ।ाउंट> 0. (यदि मॉनीटर.पुलसे या वेट टाइमआउट का उपयोग किया जाता है)
क्रेग निकोल्सन

0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.