NodeJS "गैर-अवरुद्ध" कैसे हो सकता है?


14

मैं NodeJS सीख रहा हूँ और बस कुछ स्पष्ट करना चाहता था। कई परिचयात्मक ट्यूटोरियल और पुस्तकों में अब तक, बहुत जल्दी उन्होंने नोड के "गैर-अवरुद्ध" वास्तुकला का वर्णन किया है - या इसके बजाय कि यह संभव है (और अनुशंसित है, पूरे बिंदु) को गैर-अवरुद्ध तरीके से कोड करना है।

इसलिए उदाहरण के लिए, यह उदाहरण एक पुस्तक में दिया गया था जो मैं डेटाबेस से डेटा प्राप्त करने के लिए एक अतुल्यकालिक तरीके से पढ़ रहा हूं।

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

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

मेरा प्रश्न यह है कि डेटाबेस अनुरोध को वास्तव में क्या संसाधित कर रहा है? निश्चित रूप से नोड को ब्लॉक करना पड़ता है जबकि ऐसा होता है? डेटाबेस अनुरोध का क्या ख्याल है? या यदि नोड बाहरी संसाधन के लिए अतुल्यकालिक HTTP जीईटी अनुरोध पर प्रतीक्षा कर रहा है, तो उस अनुरोध का क्या ख्याल है जो नोड को कॉल स्टैक को संसाधित करने और "गैर-अवरुद्ध" होने की अनुमति देता है?

जवाबों:


17

जब Node.js को "गैर-अवरुद्ध" के रूप में वर्णित किया जाता है, तो इसका विशेष रूप से अर्थ है कि इसका IO गैर-अवरुद्ध है। नोड एक मंच-अज्ञेय तरीके से अपने IO को संभालने के लिए libuv का उपयोग करता है । विंडोज पर, यह IO पूरा करने वाले बंदरगाहों का उपयोग करता है, यूनिक्स पर, यह epoll / kqueue / select / etc का उपयोग करता है। तो, यह एक गैर-अवरोधक IO अनुरोध करता है (जिसमें पृष्ठभूमि थ्रेड मॉनिटरिंग हो सकती है, लेकिन यह जावास्क्रिप्ट के संपर्क में नहीं है) और इसके परिणामस्वरूप, यह इवेंट लूप के भीतर इसे कतार में रखता है, जो मुख्य पर जावास्क्रिप्ट कॉलबैक कहता है (पढ़ें: केवल) जावास्क्रिप्ट धागा।

डेटाबेस के लिए, यह इस बात पर निर्भर करता है कि लाइब्रेरी कैसे लिखी जाती है। यदि यह HTTP का उपयोग संचार के लिए करता है (जैसा कि कुछ NoSQL डेटाबेस करते हैं), तो इसे मानक नोड httpलाइब्रेरी का उपयोग करके आसानी से शुद्ध जावास्क्रिप्ट में लिखा जा सकता है । यदि यह इसे दूसरे तरीके से करता है, ठीक है, तो यह पुस्तकालय पर निर्भर है। यह C / C ++ में लिखा जा सकता है और बैकग्राउंड थ्रेड का उपयोग तब तक किया जा सकता है जब तक कि एब्स्ट्रैक्शन कभी भी जावास्क्रिप्ट के संपर्क में न आए।

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


netHttp उपलब्ध नहीं होने पर पैकेज है।
फ्लोरियन मार्गाइन

विस्तार से जो मदद कर सकता है। नोड V8 JS इंजन का लाभ उठाता है। वी 8 की सबसे अच्छी विशेषताओं में से एक जेएस कॉल के लिए सी / सी ++ प्रक्रियाओं को बांधने में आसानी है। जावास्क्रिप्ट फ़ंक्शंस अवरुद्ध कर रहे हैं, लेकिन सभी फ़ंक्शन करता है हुड के नीचे कुछ कॉल है जो ब्लॉक नहीं करता है। फिर एक अन्य JS फ़ंक्शन उस प्रक्रिया को पूरा करने पर प्रतिक्रिया करता है। जेएस फ़ंक्शन एक दूसरे को अवरुद्ध करने का मतलब है कि आपके पास कभी भी दो चीजें करने की कोशिश नहीं होगी जैसे कि एक ही समय में एक ही फ़ाइल स्थान पर एक लिखने के लिए शेड्यूल करें, जहां मुझे लगता है कि बहु-थ्रेडेड प्रबंधित करने की आवश्यकता है। यह हमेशा स्पष्ट है कि चीजों को कतारबद्ध करने के उद्देश्य से कौन सा अनुरोध पहले आया था।
एरिक रेपेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.