आपको निश्चित रूप से 800 धागे नहीं बनाना चाहिए।
चलो यहाँ एक कदम उठाएं। आपके पास एक "सर्वर" नामक डिवाइस है जो "क्लाइंट" से "अनुरोध" लेता है और उन ग्राहकों को "प्रतिक्रियाएं" भेजता है। आइए मान लीजिए कि अनुरोध डाकघर द्वारा दिए गए कागज़ के टुकड़े हैं, और प्रतिक्रियाएं किताबों वाले बक्से हैं, जो डाकघर द्वारा भी वितरित की जाती हैं।
आप सर्वर का परीक्षण करने के लिए 800 क्लाइंट अनुकरण करना चाहते हैं।
मान लीजिए कि एक धागा एक व्यक्ति है और एक प्रोसेसर कुर्सी है। कुर्सी पर बैठे एक व्यक्ति केवल काम कर सकता है।
800 धागे बनाना 800 लोगों को भर्ती करने और सर्वर पर एक पत्र भेजने के बराबर है। लेकिन आपके पास केवल चार कुर्सियां हैं, इसलिए उन 800 लोगों को कुर्सियों का उपयोग करके मोड़ लेना होगा।
यह वास्तविक जीवन में लुडिकस समाधान होगा। थ्रेड, जैसे लोगों, बेहद महंगा हैं। आपको बनाए गए धागे की संख्या को कम करना चाहिए।
तो, क्या आप कार्य कारखाने के माध्यम से 800 कार्यों को बना सकते हैं और टीपीएल को आपके लिए समानांतर बना सकते हैं?
नहीं, आपको ऐसा नहीं करना चाहिए। टीपीएल में लोगों (धागे) का एक पूल है जो आकर्षित करने के लिए है, और यह चीजों की व्यवस्था करने की कोशिश करता है ताकि वहां बैठने के लिए कुर्सियों की तुलना में पेरोल पर कोई और लोग न हों। लेकिन आपका काम "कुर्सी बाध्य" नहीं है - - लोग कुर्सी पर बैठने जा रहे हैं, सर्वर से अनुरोध भेजते हैं, और फिर वापस आने के जवाब की प्रतीक्षा करते समय कुर्सी से बाहर निकलते हैं। जबकि वे प्रतीक्षा कर रहे हैं, टीपीएल को अब अतिरिक्त कार्यों की सेवा के लिए अधिक लोगों को किराए पर लेना है।
वेब सर्वर मारना I/O बाध्य है; आपको केवल उन कार्यों के लिए थ्रेड-पूल किए गए कार्यों को बनाना चाहिए जो सीपीयू बाध्य हैं।
सही समाधान दो लोगों को किराए पर लेना है।
एक व्यक्ति - "आई/ओ पूरा करने वाला धागा" - मेलबॉक्स में अनुरोध छोड़ने के अलावा कुछ भी नहीं करता है और आने वाले पैकेजों की जांच करता है। दूसरा व्यक्ति - "अनुकरण" व्यक्ति - 800 क्लाइंट अनुकरण करने के लिए सही "शेड्यूल" क्या काम करता है। सिमुलेशन व्यक्ति शेड्यूल का काम करता है, और फिर सो जाता है। वह सर्वर पर एक और अनुरोध भेजने का समय है जब वह उठता है। जब वह उठती है, तो वह मेलबॉक्स में इस पत्र को छोड़ने के लिए I/O पूर्णता धागा बताती है, और जब प्रतिक्रिया आती है तो उसे उठाना पड़ता है। तब वह सो जाती है जब तक कि यह कोई अन्य अनुरोध भेजने का समय न हो, या प्रतिक्रिया उसमें आता है कि सत्यापित करने की जरूरत है।
आपको क्या करना चाहिए (1) सी # 5 का बीटा संस्करण प्राप्त करें और सर्वर को अनुरोध भेजने वाले कार्यों को बनाने के लिए async/await
का उपयोग करें, और उसके बाद संदेश लूप पर नियंत्रण प्राप्त करें जब तक कि यह किसी अन्य को भेजने का समय न हो अनुरोध या प्रतिक्रिया आती है। या, यदि आप सी # 5 का उपयोग नहीं करना चाहते हैं, तो आपको कार्य पूरा करने का स्रोत बनाना चाहिए, और सही कार्यवाही करने वाले कार्यों को सेट करना चाहिए।
संक्षेप में: कई समांतर I/O कार्यों को संभालने का सही तरीका है धागे की एक बहुत छोटी संख्या बनाना, जिनमें से प्रत्येक एक समय में बहुत कम काम करता है। I/O पूर्णता धागा I/O के ब्योरे को संभालने दें। 800 अक्षरों को भेजने के अनुकरण के लिए आपको 800 लोगों को किराए पर लेने की आवश्यकता नहीं है। किराया दो लोग, मेलबॉक्स देखने के लिए और अक्षरों को लिखने के लिए एक।
[यहां संबंधित चर्चा देखें] (http://stackoverflow.com/questions/10687850/task-factory-startnew-or-parallel-foreach-for-many-long-running-tasks) –