आपको वास्तव में बहुत सारे धागे की आवश्यकता नहीं है। एक डिस्क केवल अपने अधिकतम पढ़ने और थ्रूपुट लिखने का समर्थन कर सकती है, जो एक धागा आसानी से अधिकतम हो सकता है यदि यह आईओ यानी पढ़ने या लिखने के लिए समर्पित है। आप एक साथ हार्ड डिस्क को भी पढ़ और लिख नहीं सकते हैं (हालांकि यह ओएस कैशिंग परतों आदि के साथ जटिल है), इसलिए समवर्ती धागे पढ़ने और लिखने के साथ बहुत काउंटर-उत्पादक हो सकता है। आपके गैर-आईओ कार्यों के लिए प्रोसेसर \ कोर के मुकाबले अधिक धागे होने से भी कम प्राप्त किया जा सकता है क्योंकि कोई भी अतिरिक्त धागा कोर के उपलब्ध होने के लिए अपना अधिकांश समय व्यतीत करेगा। यदि आपके पास 50 धागे और 4 कोर हैं, तो कम से कम 46 धागे किसी भी समय निष्क्रिय हो जाएंगे। बर्बाद धागे मेमोरी खपत दोनों में योगदान देंगे, प्रदर्शन ओवरहेड भी लेते हैं क्योंकि वे कोर पर कुछ समय में एक दरार पाने के लिए लड़ेंगे, और ओएस को इस लड़ाई को मध्यस्थ करना होगा।
एक और सीधा दृष्टिकोण एक एकल धागा होगा जिसका काम फाइलों में पढ़ना है, और उसके बाद डेटा को अवरुद्ध कतार में जोड़ें (उदाहरण के लिए ConcurrentQueue देखें), इस बीच कई कार्यकर्ता धागे हैं जो प्रतीक्षा कर रहे हैं कतार में फ़ाइल डेटा (उदाहरण के लिए प्रोसेसर \ कोर की संख्या के बराबर संख्या धागे)। ये कार्यकर्ता धागे कतार के माध्यम से अपना रास्ता घुमाएंगे क्योंकि आइटम जोड़े जाते हैं, और जब यह खाली होता है तो ब्लॉक करें। जब एक कार्यकर्ता धागा काम के एक टुकड़े को खत्म करता है, तो वह इसे किसी अन्य अवरुद्ध कतार में जोड़ सकता है जिसे पाठक धागे या समर्पित लेखक थ्रेड द्वारा निगरानी की जा रही है। इसका काम फाइलों को लिखना है।
यह पैटर्न आईओ और सीपीयू को सह-ऑपरेटिंग थ्रेड के बहुत छोटे गुच्छा के बीच संतुलन की तलाश करता है, जहां आईओ थ्रेड की संख्या हार्ड ड्राइव द्वारा भौतिक रूप से सक्षम होने तक सीमित है, और कई सीपीयू वर्कर थ्रेड जो सीमित हैं आपके पास प्रोसेसर \ कोर की संख्या के लिए समझदार है। संक्षेप में यह आईओ और सीपीयू काम को अलग करता है ताकि चीजें अधिक अनुमानित तरीके से व्यवहार करें।
इसके अलावा, यदि आईओ वास्तव में समस्या है (और बड़ी संख्या में धागे एक दूसरे से लड़ रहे हैं), तो आप अपनी फाइल पढ़ने और थ्रेड लिखने में सीमित करने के लिए कुछ विराम (जैसे थ्रेड। सो) डाल सकते हैं वे बहुत काम करते हैं।
अद्यतन
शायद यह समझाने के लायक क्यों वहाँ इतने सारे धागे पहली जगह में उत्पन्न किया जा रहा है है। यह थ्रेडपूल उपयोग के लिए एक अपरिवर्तनीय मामला है, और क्यूइंग वर्कटाइम के आसपास केंद्रित है जिसमें आईओ का एक घटक है।
थ्रेडपूल अपनी कतार से कार्य आइटम निष्पादित करता है और मॉनीटर करता है कि काम करने वाले सामान कितने समय तक चल रहे हैं। यदि वर्तमान में वर्कटाइम निष्पादित करने में काफी समय लग रहा है (मुझे लगता है कि स्मृति से आधे सेकेंड) तो यह पूल में अधिक धागे जोड़ना शुरू कर देगा क्योंकि ऐसा लगता है कि यह कतार को त्वरित रूप से संसाधित करेगा। हालांकि, यदि अतिरिक्त समवर्ती वर्कटाइम एक साझा डिस्क के खिलाफ काम IO भी कर रहे हैं, तो डिस्क का प्रदर्शन वास्तव में कम हो जाएगा, जिसका अर्थ है कि वर्कटाइम निष्पादित करने में और अधिक समय लगेगा। क्योंकि वर्कटाइम निष्पादित करने में अधिक समय ले रहे हैं, थ्रेडपूल अधिक धागे जोड़ता है। यह degenerative मामला है, जहां प्रदर्शन और भी बदतर हो जाता है क्योंकि अधिक धागे जोड़े जाते हैं।
सुझाव के रूप में एक सेमफोर का उपयोग सावधानी से किया जाना चाहिए, क्योंकि सेमफोर थ्रेडपूल धागे को अवरुद्ध कर सकता है, थ्रेडपूल कार्य निष्पादन को निष्पादित करने में लंबा समय लगेगा, और यह अभी भी अधिक धागे जोड़ना शुरू कर देगा।
आप कहते हैं "फाइलें इतनी जल्दी तैयार हो रही हैं, यह यूआई को बांध रही है"। प्रत्येक बार एक फ़ाइल तैयार होने पर यूआई अपडेट किया जाता है? यदि हां, तो क्या यह असली मुद्दा हो सकता है ?? –