बहु-सूत्रण के लिए नोड जेएस विकल्प का लोभी


142

अगर मैं सही ढंग से समझता हूं कि नोड जेएस गैर अवरुद्ध है ... तो डेटाबेस या अन्य प्रक्रिया से प्रतिक्रिया की प्रतीक्षा करने के बजाय यह कुछ और पर चला गया और बाद में वापस जाँच करता है।

साथ ही यह सिंगल थ्रेडेड है।

तो क्या इन सबका मतलब यह है कि किसी दिए गए Node JS प्रोसेस में एक सिंगल CPU कोर का पूरी तरह से और कुशलता से उपयोग किया जा सकता है, लेकिन यह मशीन पर किसी अन्य कोर का उपयोग नहीं करेगा, जैसे कि, यह कभी भी एक से अधिक का उपयोग नहीं करेगा।

यह निश्चित रूप से इसका मतलब है कि अन्य सीपीयू अभी भी एसक्यूएल डेटाबेस या अन्य जानबूझकर अलग सीपीयू भारी सबरूटीन्स जैसी चीजों के लिए अन्य प्रक्रियाओं द्वारा उपयोग किया जा सकता है जब तक कि वे एक अलग प्रक्रिया हैं।

इस घटना में भी कि नोड जेएस प्रक्रिया में एक अंतहीन लूप या लॉन्ग रनिंग फंक्शन है, यह प्रक्रिया अब किसी भी तरह से उपयोगी नहीं है जब तक कि अंतहीन लूप या लॉन्ग रनिंग फंक्शन को रोक नहीं दिया जाता (या पूरी प्रक्रिया को मार दिया जाता है)।

क्या यह सब सही है? क्या मैं अपनी समझ में सही हूं?


2
"नोड" एकल थ्रेडेड नहीं है । केवल JS / V8 इंजन एक ही धागे में चलता है। NodeJS का libuv हिस्सा बहु-थ्रेडेड है। देखें क्या NodeJS वास्तव में सिंगल-थ्रेडेड है?
राबेल

जवाबों:


87

बहुत सही, हाँ। नोड.जेएस सर्वर में एक आंतरिक थ्रेड पूल होता है ताकि यह ब्लॉकिंग ऑपरेशन कर सके और चीजों के पूरा होने पर एक कॉलबैक या ईवेंट के साथ मुख्य थ्रेड को सूचित कर सके।

तो मुझे लगता है कि यह थ्रेड पूल के लिए एक और कोर का सीमित उपयोग करेगा, उदाहरण के लिए यदि आप एक गैर-ब्लॉकिंग फ़ाइल सिस्टम पढ़ते हैं तो यह संभव है कि थ्रेड पूल से एक थ्रेड को पढ़ने और कॉलबैक सेट करने के लिए कहकर लागू किया जाए यह किया जाता है जिसका अर्थ है कि रीड एक अलग थ्रेड / कोर पर हो रहा है जबकि मुख्य नोड.जेएस प्रोग्राम कुछ और कर रहा है।

लेकिन नोड.जेएस के दृष्टिकोण से, यह पूरी तरह से एकल पिरोया हुआ है और सीधे एक से अधिक कोर का उपयोग नहीं करेगा।


2
मैं अभी भी Node.js में नया हूं और यहां चर्चा की सराहना करता हूं। मैं केवल यह बताना चाहता था कि गैर-अवरोधक कॉल थ्रेडेड ब्लॉकिंग कॉल द्वारा समर्थित हैं, शायद यह समझदारी नहीं है (न कि @jcoder ने इन मान्यताओं के आसपास वास्तुकार कोड को सुझाव दिया है)। इस स्थिति में, भले ही IO को एक अवरुद्ध कॉल के साथ एक अलग थ्रेड पर संभाला गया हो, फिर भी वह थ्रेड मूल रूप से IO पर प्रतीक्षा करेगा, इसलिए यह अन्य कोर / CPU का उपयोग नहीं करेगा। आपके द्वारा उपयोग किए जा रहे उपकरणों की ताकत के लिए कोड और निम्न स्तर के विवरण (जब तक वे एक समस्या नहीं बन जाते) के बारे में बहुत अधिक चिंता न करें।
wbyoung

अतः हम कॉलबैक का उपयोग कर अन्य प्रॉप्स कर सकते हैं जैसे कि जावास्क्रिप्ट कोड फ्रंटएंड पर
yussan

37

हां, मैं कहूंगा कि आपकी समझ पूरी तरह से सही है। यह लेख ( संग्रहीत ) इस डिजाइन के पीछे के तर्क को काफी अच्छी तरह से समझाता है। यह शायद सबसे महत्वपूर्ण पैराग्राफ है:

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


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

1
@peterh आप समझ में नहीं आ रहे हैं। लेख पूरी तरह से सही है, जिसमें कहा गया है कि अपाचे विन्यास के आधार पर मल्टीप्रोसेस या मल्टीथ्रेडेड है। कई कनेक्शनों को संभालने के संबंध में मल्टीप्रोसेस का मामला और भी खराब है, यही एकमात्र कारण है कि अपाचे का उल्लेख पहले स्थान पर किया गया है। इसके अतिरिक्त, आमतौर पर इस्तेमाल किया जाने वाला PHP मॉड्यूल अपने आप ही सभी से अलग हो जाता है। और अंत में, जबकि मैं एक अपाचे विशेषज्ञ नहीं हूं, अन्य लेखों से मेरी धारणा यह है कि कार्यकर्ता एमपीएम वास्तव में बहुत अधिक उपयोग किया जाता है।
माइकल बोर्गवर्ड

@MichaelBorgwardt हां, अपाचे को मल्टीथ्रेड किया जा सकता है और मल्टीप्रोसेस भी, मैंने इससे इनकार नहीं किया। लेकिन मल्टीप्रोसेस कॉन्फ़िगरेशन के साथ php असंगत है, और यदि आप एक अपाचे विशेषज्ञ होंगे तो आप निश्चित रूप से इसे जान पाएंगे। आमतौर पर उपयोग किए जाने वाले php मॉड्यूल को मल्टीथ्रेड नहीं किया जाता है। आपकी जानकारी झूठी है। मैं एक परीक्षण विन्यास की कोशिश करने का सुझाव देता हूं और आप देखेंगे। यह एक तथ्यात्मक बात है, बहस का विषय नहीं है, इसे आज़माएँ और आप देखेंगे।
पीटर - मोनिका

27

यहां तक ​​कि अगर यह एक पुराना धागा है, तो मैंने सोचा, कि मैं एक विचार के साथ साझा करूंगा, कि नोड में एक कोर का उपयोग कैसे करें। जेपी ऐप। जैसा कि न्युटे अल्टिन ने उल्लेख किया है - जेएक्सकोर ऐसा कर सकता है।

सरल उदाहरण:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

डिफ़ॉल्ट रूप से दो धागे हैं (आप इसे बदल सकते हैं jxcore.tasks.setThreadCount())

बेशक बहुत कुछ है जो आप कार्यों के साथ कर सकते हैं। डॉक्स यहां हैं

उस विषय पर कुछ लेख:


13

चूंकि यह सवाल लगभग 2 साल पहले पूछा गया था। चीजें अलग हो रही हैं या Node.JS पर समस्या को हल करने के लिए वैकल्पिक दृष्टिकोण हैं

नीचे दिए गए ब्लॉग पोस्ट के अनुसार, आने वाले 'कार्य' एक्सटेंशन का उपयोग करते हुए, कुछ अन्य उपलब्ध कोर से सीधे लाभ उठा सकते हैं।

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html


1

Node.js एक एकल-थ्रेडेड अनुप्रयोग है, लेकिन यह ईवेंट और कॉलबैक की अवधारणा के माध्यम से संगति का समर्थन कर सकता है। यहाँ द्वारा वीडियो है फिलिप रॉबर्ट्स जो बताता है कि कैसे जावास्क्रिप्ट में ईवेंट-लूप काम करता है।

वीडियो देखने के लिए यहां क्लिक करें

(WebAPI के बजाय Node.js में C ++ API हैं)


2
यह एक टिप्पणी होनी चाहिए
चेर्निव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.