2015-06-04 12 views
8

सिंगल थ्रेडेड होने के बावजूद, node.js कैसे तेज़ है? मैंने आंकड़े खोजने के लिए कोई परीक्षण नहीं किया है, लेकिन node.js मंचों में खुदाई करते समय, मुझे लगता है कि हर कोई कहता है कि यह तेज़ और अधिक हल्का है। कोई फर्क नहीं पड़ता कि यह कितना हल्का वजन है, एक थ्रेडेड सर्वर बहु ​​थ्रेड वाले से तेज कैसे हो सकता है?जब यह सिंगल थ्रेडेड होता है तो node.js तेज़ क्यों होता है?

+8

क्या तुलना में तेज़ ??? –

+1

@LaurentB यह ब्राउज़र पर सर्वर की तुलना में निश्चित रूप से तेज़ है ... – Glorfindel

+0

मैं एक और भ्रम @ DenysSéguret hv। नोड काम करता है, यह कुछ आईओ शुरू करता है और कॉलबैक असाइन करता है। अब ओएस एक बार प्रक्रिया समाप्त कर देता है, जो कॉलबैक का आह्वान करता है? क्या यह घटना लूप फिर से है? यदि हां, तो क्या यह घटना लूप के हजारों कॉलबैक के उन हिस्सों को प्रबंधित करने के लिए एक गलती नहीं होगी? इवेंट लूप बहु थ्रेडेड क्यों नहीं है? –

उत्तर

19

सबसे पहले, बहु-थ्रेडेड होने पर प्रोग्राम तेज क्यों होता है?

यह आंशिक रूप से इस तथ्य के कारण है कि बहु-थ्रेडेड प्रोग्राम एकाधिक कोर पर चल सकता है लेकिन मुख्य कारण यह है कि जब तक कोई थ्रेड कुछ आईओ ऑपरेशन (जो अक्सर होता है, विशेष रूप से सर्वर में)), अन्य धागे अभी भी प्रगति कर सकते हैं।

अब, नोड के बारे में क्या?

नोड एकल धागा नहीं है। जेएस में उपयोगकर्ता स्क्रिप्ट को एक थ्रेड में निष्पादित किया जाता है लेकिन सभी आईओ ऑपरेशंस को इंजन और ओएस द्वारा नियंत्रित किया जाता है जो मल्टी-थ्रेडेड हैं।

More explanation here

अभ्यास में, इसका मतलब है कि कई अनुरोध समानांतर में संभाले जाते हैं।

user script      | node + OS "threads" (libuv) 
------------------------------------------------------------- 
receive and analyze request 1 | 
ask node for file 1    | fetching file 1 
receive and analyze request 2 | fetching file 1 
ask node for file 2    | fetching file 1, fetching file 2 
prepare response header 1  | fetching file 2 
tell node to send file 1  | send file 1, fetching file 2 
prepare response header 2  | send file 1 
tell node to send file 2  | send file 1, send file 2 

नोड (और io.js) के पूरे वास्तुकला यह आसान समानांतरवाद के एक उच्च स्तर के लिए बनाता है: इनमें से कुछ कदम के संभावित अनुक्रम का एक बहुत (बहुत) सरलीकृत उदाहरण है। यूजर थ्रेड केवल इवेंट लूप द्वारा बहुत छोटे कार्यों के लिए बुलाया जाता है जो अगले आईओ ऑपरेशन (ठीक है, वास्तव में केवल आईओ नहीं, लेकिन अक्सर) पर रोकता है जब आपका कोड कॉलबैक नोड करने के लिए देता है जिसे ऑपरेशन समाप्त होने पर बुलाया जाएगा।

बेशक यह केवल तब काम करता है जब आप नोड के असीमित कार्यों का उपयोग कर रहे हों। जब भी आप writeFileSync जैसे "सिंक" में समाप्त होने वाले फ़ंक्शन का उपयोग करते हैं, तो आप समांतरता को हरा रहे हैं।

+0

यह भी पढ़ें [StrongLoop: क्यों जावा से नोड तेजी से बनाता है] (https: // strongloop।com/strongblog/node-js-is-fast-than-java /) –

+0

आपकी स्पष्टीकरण और लिंक के लिए @ डेनिस धन्यवाद। यह मदद करता है। –

4

Node.js एकल थ्रेड नहीं है: https://nodejs.org/about/ देखें:

किसी भी कनेक्शन समवर्ती

संभाला जा सकता है वास्तव में, यह प्रणाली धागे का उपयोग नहीं करता, लेकिन इसके बजाय साथ वी 8 इंजन का उपयोग करता है libuv लाइब्रेरी बहु-थ्रेडिंग एसिंक्रोनस कॉलबैक के माध्यम से।

इसके अलावा, आप अंत में के माध्यम से child_process.fork

अतिरिक्त बच्चे की प्रक्रिया का उपयोग कर सकते हैं, इस प्रतिक्रिया या इंजन के समग्र गति की किसी भी तरह से हालत गति में नहीं है। मल्टी-थ्रेडिंग स्केलेबिलिटी के लिए यहां है।

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