Node.js में गैर-अवरोधक या अतुल्यकालिक I / O क्या है?


136

सर्वर साइड जावास्क्रिप्ट इंजन के संदर्भ में, गैर-अवरोधक I / O या अतुल्यकालिक I / O क्या है? मैं जावा सर्वर साइड कार्यान्वयन पर एक लाभ के रूप में उल्लेख किया जा रहा है।


3
इस अवधारणा को समझने के लिए ब्राउज़र वातावरण में स्क्रिप्ट टैग के बारे में सोचना उपयोगी है। ज़कस के पास इस बारे में एक शानदार लेख है - पहले कुछ खंडों को अवरुद्ध करने की अवधारणा को समझाने के लिए पर्याप्त होना चाहिए: nczonline.net/blog/2010/08/10/what-is-a-non-blocking-script
netpoetica

जवाबों:


317

एसिंक्रोनस बनाम एसिंक्रोनस

तुल्यकालिक निष्पादन आमतौर पर अनुक्रम में कोड निष्पादन को संदर्भित करता है। एसिंक्रोनस निष्पादन निष्पादन को संदर्भित करता है जो कोड में दिखाई देने वाले अनुक्रम में नहीं चलता है। निम्नलिखित उदाहरण में, तुल्यकालिक ऑपरेशन अनुक्रम में आग लगने का कारण बनता है। Async ऑपरेशन में, जबकि alert(2)दूसरा निष्पादित करने के लिए प्रकट होता है, यह नहीं है।

समकालिक: 1,2,3

alert(1);
alert(2);
alert(3);

एसिंक्रोनस: 1,3,2

alert(1);
setTimeout(() => alert(2), 0);
alert(3);

ब्लॉकिंग बनाम नॉन-ब्लॉकिंग

ब्लॉकिंग से तात्पर्य उन ऑपरेशनों से है जो उस ऑपरेशन के खत्म होने तक आगे के ब्लॉक को रोकते हैं। गैर-अवरोधन कोड को संदर्भित करता है जो निष्पादन को अवरुद्ध नहीं करता है। दिए गए उदाहरण में, localStorageएक अवरुद्ध ऑपरेशन है क्योंकि यह पढ़ने के लिए निष्पादन को रोकता है। दूसरी ओर, fetchएक गैर-अवरुद्ध ऑपरेशन है क्योंकि यह alert(3)निष्पादन से नहीं रुकता है।

// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);

लाभ

गैर-अवरुद्ध, अतुल्यकालिक संचालन का एक फायदा यह है कि आप एक सीपीयू के उपयोग के साथ-साथ मेमोरी को अधिकतम कर सकते हैं।

तुल्यकालिक, अवरुद्ध उदाहरण

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

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

अतुल्यकालिक, गैर-अवरुद्ध उदाहरण

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

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


5
मुझे यकीन नहीं है कि मैं PHP में ब्लॉकिंग के तहत आपके 2 पैरा को समझता हूं । क्या आप कह रहे हैं कि, "जबकि PHP सामान्य रूप से IO पर रोक लगाएगा, ऐसा इसलिए नहीं है क्योंकि OS स्वचालित रूप से IO संचालन को थ्रेड करता है?" या, क्या आप कह रहे हैं कि यह PHP में कोई समस्या नहीं है क्योंकि PHP स्वचालित रूप से प्रत्येक अनुरोध के लिए एक नया धागा बनाता है इसलिए एक अवरुद्ध अनुरोध पूरे PHP वातावरण को रोक नहीं पाता है? (मैं बाद का अनुमान लगा रहा हूँ ..)
dcow

6
यह बाद की बात है।
जोसेफ

2
प्रतीक्षा करें, यदि इसका मतलब बाद वाला है, तो अवरुद्ध करने वाले से अधिक I / O PHP (जैसे ReaPHPHP या कुछ और) को अवरुद्ध करने वाले फायदे क्या हैं। अभी भी भ्रमित
सुनु पिनस्थिका फजर

5
@CharlieParker हां। Async ऑपरेशन आपके कोड के समानांतर चलता है। लेकिन एस्किंक ऑपरेशन के परिणामों के लिए "वापस हो जाता है" कॉलबैक मुख्य कोड में व्यस्त होने पर निष्पादन के लिए कतारबद्ध होता है।
जोसेफ

2
@CharlieParker यहां एक ऐसी पोस्ट है जो एसिंक्स मैकेनिज्म के इंटर्नल के बारे में अधिक बताती है।
जोसेफ

7
var startTime = new Date().getTime();
var getEndTime = () => {
    var tempEndTime = new Date().getTime();
    var second = (tempEndTime - startTime)/1000
    return `took ${second} sec...to finish\n`
}

console.log('1: start App', getEndTime())
setTimeout(()=>{
    console.log('2: setTimeout', getEndTime())
}, 1000)
console.log('3: End App', getEndTime())

// console -> Process Order:  1 -> 3 -> 2

कोड उदाहरण

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