18

मैं एक मल्टी-थ्रेडेड पाश चला रहा हूँ के निष्पादन के दौरान parallelOptions.MaxDegreeOfParallelism बदलने के लिए है कई धागे को कम या बढ़ाएं।यह संभव एक Parallel.ForEach

parallelOptions.MaxDegreeOfParallelism = 5; 

यह धागे को बढ़ाने में प्रतीत नहीं होता है। क्या किसी के पास कोई विचार है?

+0

क्या आप समझा सकते हैं कि आप ऐसा क्यों करना चाहते हैं? अगर जरूरत हो तो यह पहले से ही निर्दिष्ट अधिकतम तक धागे की संख्या को बढ़ाएगा, या यदि उपयुक्त हो तो कम उपयोग करेगा। –

+1

मुख्य रूप से ऐप को throllel करने के लिए जब यह साझा किए गए सर्वर पर बहुत से संसाधनों का उपयोग कर रहा है। मुझे सर्वर 100% पर चल रहा है जो सर्वर पर अन्य अनुप्रयोगों की उत्तरदायित्व को कम करता है। –

+0

क्या यह एक सीपीयू बाध्य मुद्दा या अन्य 'संसाधन' डिस्क की तरह है? –

उत्तर

3

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

+0

हाँ यकीन है कि मैं आपकी समझ से सहमत हूं, लेकिन क्या आप कृपया एक संदर्भ लिंक जोड़ें? –

6

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

http://msdn.microsoft.com/en-us/magazine/ff960958.aspx देखें कि एनईटी में थ्रेड पूल कैसे तय करता है कि कितने धागे का उपयोग करना है, यह तय करने के जटिल कार्य को संभालता है।

आप परावर्तक का भी उपयोग कर सकते हैं और उस कोड को देख सकते हैं जो टीपीएल थ्रेड आवंटित करने के लिए उपयोग करता है और अनावश्यक संदर्भ स्विचिंग से बचने के लिए - यह जटिल है और यह डिस्क में भी पहुंच नहीं ले रहा है!

आप निम्न प्राथमिकता धागे पर कार्यों को निष्पादित करने का प्रयास कर सकते हैं (अपना खुद का TaskScheduler बनाकर जो सामान्य-सामान्य की प्राथमिकता वाले थ्रेड चलाता है वास्तव में काफी आसान है)। कम से कम यह सुनिश्चित करेगा कि आप शेष सिस्टम को प्रभावित किए बिना 100% सीपीयू चला सकते हैं। थ्रेड प्राथमिकताओं के साथ मेसिंग स्वयं समस्याओं से भरा हुआ है, लेकिन अगर यह पूरी तरह से पृष्ठभूमि कार्य है तो यह सीधा हो सकता है और मदद कर सकता है।

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

आप ओएस को सूचित करने के तरीके के रूप में SetPriorityClass पर भी देख सकते हैं कि सिस्टम पर चल रहे अन्य अनुप्रयोगों की तुलना में आपकी प्रक्रिया कम महत्वपूर्ण है, अधिक जानकारी के लिए How can I/O priority of a process be increased? देखें। लेकिन यह मानता है कि आपकी पूरी प्रक्रिया कम महत्वपूर्ण है, न कि इसके इस हिस्से में।

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