2013-08-08 5 views
6

क्या नोड का जावास्क्रिप्ट वातावरण सिंगल थ्रेडेड है, या क्या सब कुछ एक ही समय में होता है? या (अधिक संभावना है) न तो उन बयानों में से कोई भी बताएं कि नोड के साथ क्या चल रहा है।नोड कॉलबैक और सिंगल थ्रेडिंग समझा

मैं नोड के लिए नया हूं और यह समझने की कोशिश कर रहा हूं कि यह कॉलबैक को कैसे संसाधित करता है। इस विषय पर मेरा गुगल फल साबित नहीं हुआ है, और ऐसा लगता है कि प्रत्येक दर्शक के लिए अंतर संदर्भों के साथ "धागे, लॉकिंग और सिंगल थ्रेडेड" जैसे शब्दों का उपयोग करके कई ऑडियंस हैं, और मेरे पास सही ढंग से पार्स करने के लिए नोड के साथ पर्याप्त अनुभव नहीं है मैं क्या पढ़ रहा हूँ

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

अगर मैं ब्राउज़र-भूमि में हूँ और सेटअप करने के लिए लोकप्रिय जावास्क्रिप्ट लाइब्रेरियों एक गैर डोम-घटना-हैंडलर कॉलबैक में से एक का उपयोग करें, जैसे

console.log("Here"); 
$.each([1,2,3],function(){ 
    console.log("-- inside the callback --"); 
}); 
console.log("There"); 

मेरे उत्पादन कुछ लगातार

Here 
-- inside the callback -- 
-- inside the callback -- 
-- inside the callback -- 
There 
है

हालांकि,

var function example() 
{ 
    var fs = require('fs'); 
    console.log("Here"); 
    fs.readdir('/path/to/folder', function(err_read, files){ 
     console.log('-- inside the callback --');    
    }); 
    console.log("There"); 
    for(var i=0;i<10000;i++) 
    { 
     console.log('.'); 
    } 
} 
example(); 
console.log("Reached Top"); 
(यह कमांड लाइन से एक खोल स्क्रिप्ट के रूप में चल) अगर मैं नोड js में एक कॉलबैक के साथ कुछ इस तरह करते हैं

मैं लगातार (प्रतीत होता है - "ज्यादा नहीं अनुभव" ऊपर देखें) इस

Here 
There 
. 
. (repeat 10,000 times) 
Reached Top 
-- inside the callback --  

है यही कारण है कि जैसे परिणाम प्राप्त, नोड कॉलबैक कॉल करने से पहले समारोह example निष्पादित नहीं हो।

क्या यह निर्धारित नोड में निर्धारक व्यवहार है? या ऐसे समय हैं जहां example फ़ंक्शन समाप्त होने से पहले कॉलबैक कॉल किया जाएगा? या यह कॉलबैक का उपयोग कर लाइब्रेरी में कार्यान्वयन पर निर्भर करेगा?

मुझे समझ में आता है कि नोड के पीछे विचार घटना आधारित कोड लिखना है - लेकिन मैं यह समझने की कोशिश कर रहा हूं कि नोड वास्तव में क्या कर रहा है, और किस व्यवहार पर भरोसा किया जा सकता है और क्या नहीं कर सकता।

+1

संभावित डुप्लिकेट [क्या नोडजेएस वास्तव में सिंगल थ्रेडेड है?] (Http://stackoverflow.com/questions/7018093/is-nodejs-really-single-threaded) या [NodeJS ईवेंट लूप] (http: // stackoverflow .com/प्रश्न/10680601/nodejs-event-loop) – Bergi

+1

डुप्लिकेट लोगों को - मैंने पूछने से पहले उस प्रश्न को देखा। यह सवाल का जवाब देता है "क्या नोड स्वयं आंतरिक रूप से थ्रेड का उपयोग करता है"। मेरा सवाल है "जावास्क्रिप्ट उपयोगकर्तालैंड में नोड का कॉलबैक निष्पादन मॉडल क्या है"।सूक्ष्म, लेकिन महत्वपूर्ण अंतर) –

उत्तर

1

इस मामले में, आप एक ऐसा फ़ंक्शन कॉल कर रहे हैं जो आईओ कर रहा है और असीमित है। यही कारण है कि आप आउटपुट को अपने तरीके से देख रहे हैं।

क्योंकि आपका शेष कोड इनलाइन निष्पादन धागा पर निष्पादित कर रहा है - आईओ घटनाओं को ईवेंट लूप पर अपना रास्ता बनाने से पहले इसे पूरा किया जाता है।

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

2

क्या नोड का जावास्क्रिप्ट वातावरण सिंगल थ्रेडेड है, या क्या सब कुछ एक ही समय में होता है?

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

पहले मामले में:

console.log("Here"); 
$.each([1,2,3],function(){ 
    console.log("-- inside the callback --"); 
}); 
console.log("There"); 

वे कुंजी तथ्य यह है कि $.each कॉलबैक तुल्यकालिक का उपयोग करता है, इसलिए प्रभावी रूप से यह कहता है यह नियतात्मक क्रम में कॉलबैक है।

अब दूसरे मामले में, fs.readdir का उपयोग करता कॉलबैक एसिंक्रोनस रूप - यह कॉलबैक घटना शुरू किया जा करने की प्रतीक्षा कर (अर्थात, जब निर्देशिका पढ़ चुकी है) डालता है। यह किसी भी समय हो सकता है। हालांकि, कॉलिंग फ़ंक्शन नियंत्रण उत्पन्न नहीं करता है इसलिए example कॉलबैक के किसी भी कॉल से पहले हमेशा खत्म हो जाएगा।

एक वाक्य में: फ़ंक्शन/वैश्विक दायरे में परिभाषित किसी भी कॉलबैक से पहले फ़ंक्शन/वैश्विक क्षेत्र का सभी कोड निष्पादित किया जाता है।

+0

मैं कथन के बारे में थोड़ा उलझन में हूं * हालांकि, यह नियंत्रण * उत्पन्न नहीं करता है। इस मामले में "यह" कौन है? समारोह 'उदाहरण'? पुस्तकालय? नोड खुद? इसके अलावा, पुन: "उपज नियंत्रण", क्या कोई ऐसा बयान है जिसका उपयोग मैं अपने कार्यक्रम में नियंत्रण उत्पन्न करने के लिए कर सकता हूं? या अंत क्लाइंट-प्रोग्रामर के हाथों से नियंत्रण प्राप्त कर रहा है? –

+0

@AlanStorm लाइब्रेरी फ़ंक्शन (और, एक्सटेंशन 'example' द्वारा)। दूसरे शब्दों में * एसिंक्रोनस * कॉलबैक के अपवाद के साथ सभी कोड निष्पादित होंगे। – soulcheck

+0

मैंने इसका उल्लेख किया, क्योंकि अलग-अलग उपज रणनीति के साथ ढांचे हैं: [gevent] (http://www.gevent.org/) एसिंक कॉल पर उपज करता है। – soulcheck

1

मैं @ dc5 के उत्तर में थोड़ा सा जोड़ना चाहता हूं। पर यह website है वे के रूप में

Node.js नोड का वर्णन का उपयोग करता है एक घटना चालित, गैर अवरुद्ध I/O मॉडल

कार्यक्रम चालित हिस्सा बहुत महत्वपूर्ण है। यह आमतौर पर मेरे संदेह को साफ़ करता है जब मुझे नोड प्रोग्राम के निष्पादन मॉडल को समझने में परेशानी हो रही है।

तो अपने उदाहरण क्या हो रहा है ले जा रहा है:

  1. यहाँ कंसोल के लिए मुद्रित है।

  2. फाइलों में एक async कॉल किया जाता है।

  3. नोड एसिंक कॉल में श्रोता को जोड़ता है।

  4. निष्पादन रेखा जारी रखता है और मुद्रित किया जाता है।

अब यह हो सकता है कि async कॉल कोड है कि निष्पादित किया जा रहा है, लेकिन नोड js हाथ पर कार्य को पूरा करता है और फिर सेवा के लिए async कॉल रिटर्न की वर्तमान टुकड़ा से पहले पूरा हो गया है।

तो किसी भी चीज की प्रतीक्षा करने के बजाय यह लाइन में निष्पादन पर रहता है। यही कारण है कि नोड जेएस निष्पादन पाश कभी निष्क्रिय नहीं है।

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