2011-01-28 28 views
16

another of my questions पर एक टिप्पणी का कहना है कि मैं केवल "इतने सारे" थ्रेड चला सकता हूं, एक धारणा जिसे मैंने कहीं और देखा है।मैं समसामयिक रूप से कितने धागे चला सकता हूं?

थ्रेडिंग नौसिखिया के रूप में, मैं उपयोग करने के लिए अधिकतम थ्रेड कैसे निर्धारित कर सकता हूं? या यह एक "स्ट्रिंग का एक टुकड़ा कितना लंबा है" सवाल है? यह किस पर निर्भर करता है? हार्डवेयर कॉन्फ़िगरेशन या क्या?

(नेट 3.5 के साथ एमएस दृश्य स्टूडियो में वीबी, कि अगर मायने रखती है)


अपडेट:, किसी को भी किसी भी रों के बारे में पता/डब्ल्यू उपकरण जो धागे (या कार्य) के एक नंबर का सुझाव सकता है या क्या मुझे बस अपना खुद का कोड देना चाहिए जो थ्रूपुट बूंदों तक अलग-अलग संख्याओं को आजमा रहा है?


[Upperdate] लगभग सात साल बाद & अब हम a software recommendations site अगर वहाँ इस के साथ मदद करने के लिए एक उपकरण है, तो मैं asked

+2

धागे क्या कर रहे हैं? –

+1

+1 अच्छा सवाल है। वे प्रत्येक सोम डेटा संचारित करने के लिए एक एसओएपी कॉल करते हैं और – Mawg

+1

वापस लौटने के लिए प्रतीक्षा करते हैं, बेशक, "वापसी" एसिंच है, इसलिए वे वास्तव में प्रतीक्षा नहीं कर रहे हैं। अन्य धागे जैसे ही एसओएपी अनुरोध (fcuntion कॉल) HTTP – Mawg

उत्तर

9

यह आप कर रहे हैं के रूप में (शायद) एक सैद्धांतिक कंप्यूटर लेकिन एक भौतिक हार्डवेयर एक का उपयोग नहीं है, तो आप सीमित संसाधन हैं हार्डवेयर पर निर्भर करता है।

पढ़ें: Does Windows have a limit of 2000 threads per process?

इसके अलावा, भले ही आप 5000+ धागे चला सकते हैं, आपके हार्डवेयर पर निर्भर करता है, कि एक 10 धागा बराबर कार्यक्रम तुलना में बहुत धीमी चल सके। मुझे लगता है कि आपको thread pooling पर एक नज़र डालना चाहिए।

+1

+1 धन्यवाद के लिए धन्यवाद। यह मुझे देखने और समझने की कोशिश शुरू करने के लिए somethign देता है। क्या आप किसी भी एस/डब्ल्यू उपकरण से अवगत हैं जो कई धागे सुझा सकता है? – Mawg

+2

मुझे लगता है कि एक थ्रेड प्रति सीपीयू कोर का उपयोग एक समझदार विकल्प है, लेकिन यह वास्तव में उस समस्या पर निर्भर करता है जिसे आप हल करने का प्रयास कर रहे हैं। – Trinidad

+1

+1 एक कोर के साथ सैकड़ों उपकरणों को अनुकरण करना मुश्किल होगा – Mawg

2

यह मशीन पर बहुत निर्भर करता है - सीपीयू और मेमोरी मुख्य सीमित कारक हैं (हालांकि ओएस सीमाएं इसमें आ सकती हैं)।

संबंध thread pool विन्यास नेट करने के लिए भी खेलने में आता है।

+0

+1 पर भेजा जाता है, प्रतिक्रिया – Mawg

8

आमतौर पर, थ्रेड की संख्या रन सही मायने में समवर्ती CPU और सीपीयू कोर (हाइपर थ्रेडिंग सहित) आपके पास की संख्या से निर्धारित होता है। यह कहना है कि किसी भी समय चलने वाले धागे की संख्या (ऑपरेटिंग सिस्टम में) "कोर" की संख्या के बराबर होती है।

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

सचमुच, मैं कहूंगा कि .NET/Windows में बहु-थ्रेडिंग पर बहुत अधिक अध्ययन करें क्योंकि कोई व्यक्ति वास्तव में ठोस समझ नहीं लेता है, तो उससे अधिक "क्षति" करना पड़ता है। .NET में थ्रेड पूल की अवधारणा है और आपको यह जानने की ज़रूरत है कि यह विंडोज के अलावा कैसे काम करता है।

.NET 3.5/4.0 में आपको कार्य (Task Parallel Library) पर देखना चाहिए क्योंकि लाइब्रेरी कितने धागे (यदि बिल्कुल) स्पॉन करने के लिए यह निर्धारित करने का एक बेहतर काम है। टीपीएल के साथ थ्रेडपूल को एक बड़ा ओवरहाल मिलता है और यह थ्रेड और टास्क स्टीलिंग इत्यादि के बारे में बहुत चालाक है। लेकिन आप आमतौर पर कार्य के साथ काम करते हैं और धागे नहीं।

यह एक जटिल क्षेत्र है और नतीजतन, .NET ढांचे ने कार्यों को प्रस्तुत किया ताकि धागे से अमूर्त प्रोग्रामर के रूप में कार्य किया जा सके और इसलिए रनटाइम इस बारे में स्मार्ट होने की इजाजत दे, जबकि प्रोग्रामर बस इतना कहता है कि वह क्या चाहता है और इतना नहीं इसे कैसे करना है।

+1

+1 यूप है, मुझे डर है कि मैं अच्छे से ज्यादा नुकसान कर सकता हूं। मैं कार्यों को भी देखूंगा, धन्यवाद – Mawg

+2

यह उपयोगी है, मुझे लगता है कि "concurrency" और "समांतरता" शब्द (यानी जिसे आप "वास्तव में समवर्ती" के रूप में संदर्भित करते हैं) के बीच अंतर करना है। – skaffman

+0

+1 अच्छा बिंदु, धन्यवाद – Mawg

7

प्रत्येक थ्रेड अधिक मेमोरी (कर्नेल स्टैक, थ्रेड पर्यावरण ब्लॉक, थ्रेड-लोकल, स्टैक ....) का उपभोग करता है।AFAIK विंडोज में कोई स्पष्ट सीमा नहीं है, इसलिए बाधा स्मृति होगी (शायद प्रत्येक धागे के लिए ढेर)।

लिनक्स धागे में अधिक प्रक्रियाओं (साझा स्मृति के साथ) की तरह हैं और आप से विवश कर रहे हैं:

cat /proc/sys/kernel/threads-max 
+0

+ जानकारी के लिए tahnks – Mawg

+0

बहुत बढ़िया उत्तर, कमांड लाइन संकेत के लिए +1 – ShellFish

0

मैं अपने वर्तमान वर्ष सीपीयू (2005) EVGA के सीपीयू का उपयोग पर एक बार में 4 धागे चलाने के लिए सक्षम था मेरे सीपीयू बजर से पहले बर्नर (आवाज BIOS मेनू के अंदर प्रोग्राम किया गया) मतलब है कि मैं 90 * सी से अधिक मारा। ध्यान रखें कि हम एक साथ काम कर रहे डेटा थ्रेड के बारे में बात कर रहे हैं। एक अच्छा उदाहरण एक साथ कई कार्यक्रम खुलेगा। लेकिन कुल मिलाकर यह वास्तव में निर्भर करता है कि आपका सीपीयू मल्टीटास्किंग के साथ कितना अच्छा है। (दूसरे शब्दों में कई सक्रिय धागे को संभाल सकते हैं) परीक्षण करने का एक सुरक्षित तरीका है "ओसीएसकेनर (ईवीजीए द्वारा)" और "सीपीयू थर्मामीटर" ओसी स्कैनर के अंदर सीपीयू बर्नर का उपयोग करते समय परीक्षण करते समय, सुनिश्चित करें कि आपका तापमान 90 से अधिक नहीं बढ़ता है * सी (या कोई भी तापमान जिसे आप सुरक्षित महसूस करते हैं) और अपने सीपीयू को फेंकने वाले धागे की वर्तमान संख्या को देखें। 2 धागे से शुरू करें, सीपीयू तापमान देखते समय 3-5 मिनट प्रतीक्षा करें, एक और धागा जोड़ें, दोहराना। (अपने लकीर को मत दबाओ !!!) (अगर सीपीयू थर्मामीटर आपके तापमान को नहीं हटा सकता है !!!)

3

गहन कार्यों को चलाने के दौरान अंगूठे का एक बहुत अच्छा नियम आपके भौतिक कोर के समान संख्या को चलाने के लिए है गिनती।

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

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

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

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

प्रोग्राम के रूप में यह निर्धारित करने के लिए, हम

var CoreCount = System.Environment.ProcessorCount/2;

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

1

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

+0

लोल्क्स - जब मैंने पहली बार पोस्ट किया था, तो बहु-कोर CPU जैसी कोई चीज़ नहीं थी :-) सलाह के लिए धन्यवाद +1 – Mawg

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