2013-06-07 11 views
25

Node.js सर्वर I/O और क्लाइंट कनेक्शन की बड़ी संख्या से संबंधित बहुत कुशल हैं। लेकिन पारंपरिक मल्टीथ्रेडिंग सर्वर की तुलना में भारी CPU ऐप्स के लिए node.js उपयुक्त क्यों नहीं है?भारी CPU ऐप्स के लिए node.js उपयुक्त क्यों नहीं है?

मैं इसे यहाँ Felix Baumgarten

+4

इसकी सच्चाई के बावजूद; आपने यह दावा कहां उठाया? आप ऐसा क्यों सोचते हैं कि मामला यह है? – poke

+1

यदि आप जानते हैं कि यह नहीं है, तो आपको पता होना चाहिए कि यह क्यों नहीं है। अन्यथा आप किसी और की राय तोड़ रहे हैं। – meagar

+0

मैंने इसे यहां पढ़ा [फ़ेलिक्स बाउमगार्टन] (http://nodeguide.com/convincing_the_boss.html) – vuvu

उत्तर

45

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

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

एक और विकल्प सीपीयू को अलग प्रक्रियाओं में काम करना होगा और नोड को काम करने की बजाए उन लोगों के साथ बातचीत करना होगा।

संबंधित बातों को पढ़ने के लिए:

+1

की तरह है जो कार्यकर्ता धागे कॉल बैक कर रही हैं, ये इस आलेख के अनुसार थ्रेडपूल से संबंधित हैं: http: // www.aaronstannard.com/post/2011/12/14/Intro-to-NodeJS-for-NET- डेवलपर.aspx – vuvu

+4

आपका कोड उन कार्यकर्ता धागे पर नहीं चलेगा।उनका उपयोग तब किया जाता है जब आप कुछ अतुल्यकालिक (I/O सामान) शुरू करते हैं, लेकिन जैसे ही वे कॉलबैक कहते हैं, आप ईवेंट लूप पर वापस आ जाते हैं। तो आपके द्वारा लिखे गए सभी कोड एक थ्रेड पर होंगे। – poke

+0

धन्यवाद @ पोक !!! – vuvu

10

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

इस से निपटने के लिए, उत्पादन नोड.जेएस ऐप्स जो बहुत सारे CPU को हॉग करने की अपेक्षा करते हैं, आमतौर पर क्लस्टर में चलेंगे। इसका मतलब है कि एक प्रोग्राम की मेमोरी स्पेस में कई धागे होने के बजाय, आप एक "मास्टर" इंस्टेंस के नियंत्रण में उसी प्रोग्राम के कई उदाहरण चलाते हैं। प्रत्येक प्रक्रिया एकल-थ्रेडेड होती है, लेकिन चूंकि आपके पास उनमें से कई हैं, इसलिए आप कई धागे के लाभ प्राप्त कर लेते हैं।

+0

मैंने इस आलेख को पढ़ा है, कहां कहता है कि इवेंट लूप केवल थ्रेडेड है, लेकिन गणनाओं को घटनाओं के लिए नहीं, देखो, डॉविंग में एक थ्रेडपूल है http://www.aaronstannard.com/post/2011/12/14/ Intro-to-NodeJS-for-NET-Developers.aspx – vuvu

+0

@vuvu: वह लेख थोड़ा उलझन में है। वह पहले गलत तरीके से बताता है (प्रत्येक इवेंट हैंडलर का अपना धागा मिलता है), लेकिन बाद में इसे सही तरीके से समझाता है (कई यूटिलिटी फ़ंक्शंस जिन्हें आप अपने ईवेंट हैंडलर में बैकग्राउंड थ्रेड पर चलाते हैं ताकि आप जब ब्लॉक कर सकें तो ब्लॉक न करें , एक फाइल पढ़ना)। [यह आलेख] (http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/) इसे और स्पष्ट रूप से समझाता है। – Chuck

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