2011-10-08 5 views
36

चूंकि कई node.js स्क्रिप्ट्स असीमित रूप से कुछ करने के पैटर्न का पालन करती हैं (नीचे उदाहरण), उन्हें कैसे रोकना है?एक node.js प्रक्रिया कैसे रुकती है पता है?

निम्नलिखित कोड में, लिखने की प्रक्रिया को संसाधित करने के बाद नोड निर्धारित करता है, और कॉलबैक को उचित रूप से पंजीकृत करता है, कि कॉलबैक चलाने तक प्रक्रिया को जीवित रखा जाना चाहिए?

fs = require('fs'); 

fs.writeFile('foo', 'cat', function() { 
    console.log('wrote to foo!'); 
    fs.readFile('foo', 'utf8', function(err, data) { 
    console.log(data); 
    }); 
}); 

उत्तर

40

नोड सभी उत्कृष्ट कार्य अनुरोधों का ट्रैक रखता है। आपकी fs.writefile() कॉल I/O के लिए एक कार्य अनुरोध बनाता है और उस अनुरोध पर आपका कॉलबैक जोड़ता है। नोड कार्य तालिका अनुरोध को उसी समय में सहेजता है जब यह I/O गतिविधि शुरू कर रहा है। जब आप अपने फ़ंक्शन के अंत तक पहुंचते हैं तो आपका कोड निष्पादन निकलता है। (लेकिन आपकी याददाश्त/चर/इत्यादि)

बाद में I/O समाप्त होता है और नोड कार्य तालिका को इसकी तालिकाओं से बाहर ले जाता है। यह अनुरोध से जुड़े कॉलबैक को देखता है और इसलिए I/O अनुरोध के परिणामों के साथ कार्य करता है। आपका वैश्विक डेटा अभी भी आसपास है और बंद होने में कोई भी चर मौजूद है, इसलिए ऐसा लगता है कि यह आपके कोड को कभी नहीं रोका।

यदि आप कुछ और नहीं करते हैं, तो कोई और अनुरोध न करें, फिर जब आप अपने कार्यों से वापस आते हैं तो नोड रुक जाएगा, क्योंकि तब कतारों में कोई शेष अनुरोध नहीं होगा।

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

कृपया ध्यान दें कि "कतारबद्ध कार्य" में टाइमर की प्रतीक्षा करने या नेटवर्क डेटा आने की प्रतीक्षा जैसी चीज़ें शामिल हो सकती हैं। आप एक अनुरोध करते हैं जो कहता है "मुझे यहां कॉल करें/अगर कुछ बाद में होता है"।

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

net.Server.listen() एक और कार्य अनुरोध है जो एक सतत कार्य अनुरोध है। आपको नहीं पता कि आपकी कॉलबैक कब कॉल की जाएगी या कितनी बार, क्योंकि यह आपके सर्वर से कनेक्ट रिमोट क्लाइंट पर निर्भर करता है। जब तक आप अनुरोध रद्द नहीं करते हैं तब तक नोड कार्य तालिका को अपने टेबल में जिंदा रखता है।

+15

क्या आपके अनुरोध को चित्रित करने के लिए किए गए काम अनुरोधों और तालिकाओं की अवधारणाएं हैं या ये वास्तविक संरचना नोड के कार्यान्वयन में उपयोग की जाती हैं? मैं पूछता हूं क्योंकि मुझे इन शब्दों को कहीं और इस्तेमाल नहीं किया जाता है। – d512

+0

मेरा मानना ​​है कि कार्य अनुरोधों को कार्यों और तालिकाओं के रूप में जाना जाता है जिन्हें कार्य कतार के रूप में जाना जाता है। Https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ देखें –

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