2009-09-09 14 views

उत्तर

23

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

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

बेशक, ऐसे मामलों में आप वेब एप्लिकेशन में काम को कतार में भी बेहतर कर सकते हैं, और एक अलग सेवा डेक्यू और प्रक्रिया कर सकते हैं - लेकिन फिर आप कॉलर को तत्काल प्रतिक्रिया प्रदान नहीं कर सकते हैं (वे पूरा करने आदि को सत्यापित करने के लिए बाद में जांच करने की आवश्यकता है)।

+1

अच्छा जवाब, विशेष रूप से इनबिल्ट एसिंक ऑपरेशंस का उपयोग करने की सिफारिश। – RichardOD

1

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

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

3

आईएमएचओ आपको वेब आधारित एप्लिकेशन में मल्टीथ्रेड के उपयोग से बचना चाहिए।

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

लेकिन अगर आप कुछ समवर्ती कनेक्शन है हो सकता है आप एक वैश्विक प्रदर्शन में ख़राबी

1

ASP.NET बिना समानांतर धागा उपयोग कर सकते हैं पहले से ही इतना आसान अनुरोध प्रक्रिया के लिए वहाँ समानांतर में कई अनुरोध के प्रसंस्करण के लिए कई धागे को उत्पन्न करने में सक्षम है, शायद ही कभी एक मामला है जब आपको मैन्युअल रूप से एक और धागा उत्पन्न करना होगा। हालांकि, वहाँ कुछ असामान्य स्थितियों है कि मैं भर में जो एक और धागा के निर्माण warranted आए हैं कर रहे हैं:

  • अगर वहाँ कुछ आपरेशन कि कुछ समय लग सकता है और पेज प्रसंस्करण के बाकी के साथ समानांतर में चलाया जा सकता है, आप वहां एक माध्यमिक धागा पैदा कर सकते हैं। उदाहरण के लिए, यदि कोई वेबसाइव था जिसे आपको अनुरोध के परिणामस्वरूप मतदान करना पड़ा था, तो आप पेज_इनिट में एक और धागा उत्पन्न कर सकते हैं, और पेज_PreRender में परिणाम की जांच कर सकते हैं (यदि आवश्यक हो तो प्रतीक्षा करें)। यद्यपि यह अभी भी एक प्रश्न है यदि यह एक प्रदर्शन लाभ होगा या नहीं - एक धागा पैदा करना सस्ता नहीं है और एक सामान्य पेज_इनिट और पेज_Prerender के बीच का समय मिलीसेकंड में मापा जाता है। इसके लिए एक थ्रेड पूल रखना थोड़ा और अधिक कुशल हो सकता है, और एएसपी.नेट में "एसिंक्रोनस पेज" नामक कुछ भी है जो इस आवश्यकता के लिए बेहतर भी हो सकती है।
  • यदि संसाधनों का एक पूल है जिसे आप समय-समय पर साफ करना चाहते हैं। उदाहरण के लिए, कल्पना करें कि आप कुछ अजीब डीबीएमएस का उपयोग कर रहे हैं जो सीमित .NET बाइंडिंग के साथ आता है, लेकिन पूलिंग समर्थन नहीं है (यह मेरा मामला था)।उस स्थिति में आप स्वयं डीबी कनेक्शन पूल को कार्यान्वित करना चाहते हैं, और इसके लिए एक "क्लीनर थ्रेड" की आवश्यकता होगी जो एक मिनट में जागृत हो जाए और जांच करे कि क्या ऐसे कनेक्शन हैं जो लंबे समय तक उपयोग नहीं किए गए हैं (और इस प्रकार बंद किया जा सकता है)।

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

2

मल्टीथ्रेडिंग एक प्रक्रिया है जो अधिक प्रोसेसिंग समय के साथ एक प्रक्रिया प्रदान करने के लिए तेज़ी से चलाने की अनुमति देती है। इसमें अधिक धागे हैं इसलिए यह अधिक CPU चक्र खाता है। (एकाधिक सीपीयू से, यदि आपके पास कोई है।) डेस्कटॉप एप्लिकेशन के लिए, यह बहुत समझ में आता है। लेकिन एक वेब उपयोगकर्ता को अधिक CPU चक्र प्रदान करने से 99 अन्य उपयोगकर्ताओं से एक ही चक्र निकल जाएगा जो एक ही समय में अनुरोध कर रहे हैं! तो तकनीकी रूप से, यह एक बुरी बात है।

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

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

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

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