सर्वर साइड जावास्क्रिप्ट इंजन के संदर्भ में, गैर-अवरोधक I / O या अतुल्यकालिक I / O क्या है? मैं जावा सर्वर साइड कार्यान्वयन पर एक लाभ के रूप में उल्लेख किया जा रहा है।
सर्वर साइड जावास्क्रिप्ट इंजन के संदर्भ में, गैर-अवरोधक I / O या अतुल्यकालिक I / O क्या है? मैं जावा सर्वर साइड कार्यान्वयन पर एक लाभ के रूप में उल्लेख किया जा रहा है।
जवाबों:
तुल्यकालिक निष्पादन आमतौर पर अनुक्रम में कोड निष्पादन को संदर्भित करता है। एसिंक्रोनस निष्पादन निष्पादन को संदर्भित करता है जो कोड में दिखाई देने वाले अनुक्रम में नहीं चलता है। निम्नलिखित उदाहरण में, तुल्यकालिक ऑपरेशन अनुक्रम में आग लगने का कारण बनता है। 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 ऑपरेशन पूरा हो जाता है और वापस लौटता है, तो संबंधित कॉलबैक दूसरी कतार से बाहर आ जाता है और तीसरी कतार में कतारबद्ध हो जाता है जहां वे निष्पादन लंबित होते हैं। जब इंजन को कुछ और निष्पादित करने का मौका मिलता है (जैसे कि निष्पादन स्टैक खाली हो जाता है), तो यह तीसरी कतार से कॉलबैक उठाता है और इसे निष्पादित करता है।
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