दिलचस्प पोस्ट
PHP – file_get_contents के साथ कुकी भेजें नल योग्य प्रकार एक नल योग्य प्रकार नहीं है? मुझे ऐरो फ़ंक्शन ECMAScript 6 में कब का उपयोग करना चाहिए? जावास्क्रिप्ट में दिनांक के बीच अंतर फोरट्रोन नियुक्ति पर हस्ताक्षर और सहेजे गए गुण प्राप्त सीएसएस का उपयोग कर एक लिंक डालें प्रोटोटाइपिकल विरासत – लेखन Hadoop में मेमोरी त्रुटि से बाहर किसी दूसरे निर्माता से कॉल करें पीजी :: कनेक्शनबैड – सर्वर से कनेक्ट नहीं हो सका: कनेक्शन ने इनकार कर दिया जावास्क्रिप्ट का उपयोग कर फ़ाइल के एमडी 5 हैश की गणना कैसे करें पायथन: लूप में सभी टेक्स्ट फाइल लाइन पढ़ें क्या एफ को अक्षम करना संभव है: ईवेंट प्रकार = "प्रीरेंडरदृश्य" श्रोता, पोस्टबैक पर? कैसे प्रतिक्रिया से बचें। अंत () "धागा रद्द किया जा रहा था" एक्सेल फ़ाइल डाउनलोड के दौरान अपवाद सी में सर्वोच्च ऑर्डर बिट खोजें

इवेंट लूप को समझना

मैं इसके बारे में सोच रहा हूं और यह है कि मैं किसके साथ आया हूं:

मान लें कि हमारे पास ऐसा कोड है:

console.clear(); console.log("a"); setTimeout(function(){console.log("b");},1000); console.log("c"); setTimeout(function(){console.log("d");},0); 

एक अनुरोध में आता है, और जे एस इंजन चरण से ऊपर के कोड को क्रियान्वित करना शुरू करता है। पहले दो कॉल सिंक कॉल हैं लेकिन जब setTimeout विधि सेट करने के लिए आता है, यह एक async निष्पादन हो जाता है। लेकिन जेएस तुरंत इसे से वापस लौटता है और निष्पादन जारी करता है, जिसे Non-Blocking या Async कहा जाता है और यह अन्य आदि पर काम करना जारी रखता है।

इस निष्पादन के परिणाम निम्न हैं:

acdb

तो मूल रूप से दूसरा setTimeout पहले पूरा हो गया था और इसके कॉलबैक फ़ंक्शन को पहली बार से पहले निष्पादित किया जाता है और यह समझ में आता है।

हम एकल-थ्रेडेड एप्लिकेशन के बारे में यहां बात कर रहे हैं। जेएस इंजन इसको क्रियान्वित करता है और जब तक कि यह पहला अनुरोध पूरा नहीं करता है, यह दूसरा नहीं होगा। लेकिन अच्छी बात यह है कि यह setTimeout जैसे अवरुद्ध करने के संचालन के लिए इंतजार नहीं करेगा ताकि यह setTimeout हो सके क्योंकि यह नए इनकमिंग अनुरोधों को स्वीकार करता है

लेकिन निम्नलिखित प्रश्नों के आसपास मेरे प्रश्न उठते हैं:

# 1: यदि हम एक एकल-थ्रेडेड एप्लिकेशन के बारे में बात कर रहे हैं, तो जेएस इंजिन द्वारा अधिक अनुरोध स्वीकार किए जाते हैं और उन्हें निष्पादित करते समय setTimeouts क्या प्रक्रिया सेट करते हैं? एकल अनुरोधों को अन्य अनुरोधों पर कैसे काम करना जारी रखता है? setTimeout पर क्या काम करता है जबकि अन्य अनुरोध आते हैं और निष्पादित हो जाते हैं।

# 2: यदि इन सेट setTimeout फ़ंक्शंस को पर्दे के पीछे क्रियान्वित किया जाता है, जबकि अधिक अनुरोध आ रहे हैं और निष्पादित किया जा रहा है, तो क्या दृश्यों के पीछे एसिंन्क फांसी फैल जाती है? क्या बात है जो हम EventLoop को EventLoop ?

# 3: लेकिन पूरी विधि को EventLoop में नहीं रखा जाना चाहिए ताकि पूरी चीज निष्पादित हो और कॉलबैक विधि को बुलाया जाए? कॉलबैक फ़ंक्शंस के बारे में बात करते समय यह मैं समझता हूं:

 function downloadFile(filePath, callback) { blah.downloadFile(filePath); callback(); } 

लेकिन इस मामले में, जेएस इंजन को यह कैसे पता है कि यह एक EventLoop? Perhaps something like the फ़ंक्शन है, ताकि वह EventLoop? Perhaps something like the में कॉलबैक डाल EventLoop? Perhaps something like the EventLoop? Perhaps something like the सी # या एंट्रीबैक EventLoop? Perhaps something like the एसिन्क` कीवर्ड की तरह कुछ जो इंगित करता है कि जेएस इंजन जिस पद्धति पर ले जाएगा, वह एक async विधि है और इसके अनुसार इलाज किया जाना चाहिए।

# 4: लेकिन एक लेख कहता है कि मैं किस चीज पर काम कर रहा था, उसके बारे में काफी विपरीत है:

इवेंट लूप कॉलबैक फ़ंक्शंस की एक पंक्ति है। जब एक async फ़ंक्शन निष्पादित होता है, तो कॉलबैक फ़ंक्शन कतार में धकेल दिया जाता है। जावास्क्रिप्ट इंजन ईवेंट लूप को प्रसंस्करण प्रारंभ नहीं करता जब तक कि एक async फ़ंक्शन निष्पादित नहीं होता है।

# 5: और यहां यह छवि मौजूद है जो सहायक हो सकती है लेकिन छवि में पहली स्पष्टीकरण वास्तव में एक ही बात जो प्रश्न संख्या 4 में उल्लेखित है:

यहां छवि विवरण दर्ज करें

तो मेरा प्रश्न यहां ऊपर सूचीबद्ध मदों के बारे में कुछ स्पष्टीकरण प्राप्त करना है?

Solutions Collecting From Web of "इवेंट लूप को समझना"

1: यदि हम एक एकल-थ्रेडेड एप्लिकेशन के बारे में बात कर रहे हैं, तो सेट-टाइमआउट की प्रक्रियाओं के दौरान जेएस इंजन अधिक अनुरोधों को कब स्वीकार करता है और उन्हें निष्पादित करता है? क्या यह एक धागा अन्य अनुरोधों पर काम करना जारी रखेगा? फिर setTimeout पर काम करना जारी रखेगा, जबकि अन्य अनुरोध आते हैं और निष्पादित हो जाते हैं।

नोड प्रक्रिया में केवल 1 थ्रेड है जो वास्तव में आपके प्रोग्राम के जावास्क्रिप्ट को निष्पादित करेगा। हालांकि, नोड के अंदर, वास्तव में इवेंट लूप तंत्र के कई थ्रेड्स हैंडलिंग हैं, और इसमें IO थ्रेड्स का एक पूल और एक मुट्ठी भर अन्य शामिल हैं चाबी इन थ्रेड्स की संख्या संगत कनेक्शनों की संख्या के अनुरूप नहीं होती है, जैसे वे थ्रेड-प्रति-कनेक्शन संगामिति मॉडल में होती हैं।

अब "setTimeouts निष्पादित" के बारे में, जब आप setTimeout आह्वान करते हैं, तो सभी नोड मूल रूप से भविष्य में एक समय में क्रियान्वित करने के लिए फ़ंक्शंस का एक डेटा संरचना अपडेट करते हैं। यह मूल रूप से सामान की कतारों का एक गुच्छा है जो आवश्यक है और ईवेंट लूप के प्रत्येक "टिक" का चयन करता है, इसे कतार से निकालता है, और इसे चलाता है

एक महत्वपूर्ण बात यह समझने की है कि नोड ओएस पर अधिकांश भारी भारोत्तोलन के लिए निर्भर करता है। इसलिए आने वाले नेटवर्क अनुरोधों को वास्तव में ओएस द्वारा ट्रैक किया जाता है और जब नोड एक को नियंत्रित करने के लिए तैयार होता है, तो यह सिस्टम कॉल का उपयोग करता है, जो नेटवर्क के अनुरोध के लिए ओएस से अनुरोध करता है कि डेटा संसाधित करने के लिए तैयार हो। आईओ "काम" नोड के बहुत अधिक है "हे ओएस, पढ़ने के लिए तैयार डेटा के साथ एक नेटवर्क कनेक्शन मिला है?" या "हे ओएस, मेरी कोई भी बकाया फाइल सिस्टम कॉल में डेटा तैयार है?" अपने आंतरिक एल्गोरिथ्म और इवेंट लूप इंजिन डिज़ाइन के आधार पर, नोड जावास्क्रिप्ट को चलाने के लिए एक "टिक" का चयन करेगा, इसे चलाएगा, फिर प्रक्रिया फिर से दोहराना होगा। यही इवेंट लूप का मतलब है। नोड मूल रूप से हमेशा "जावास्क्रिप्ट के अगले थोड़ा सा चलना चाहिए?" का निर्धारण करने के लिए, फिर इसे चलाना यह कारक जिसमें आईओ ने ओएस पूरा कर लिया है, और उन चीजों को जो कि जावास्क्रिप्ट में कॉल करने के लिए सेट की गई है, setTimeout या process.nextTick

2: यदि इन सेट टाइमआउट को पर्दे के पीछे निष्पादित किया जाएगा, जबकि अधिक अनुरोध आ रहे हैं और इन्हें निष्पादित किया जा रहा है, यह दृश्य परिदृश्य के पीछे एसिंक फांसी को लेकर है जो कि हम इवेंट लूप के बारे में बात कर रहे हैं?

पर्दे के पीछे कोई जावास्क्रिप्ट निष्पादित नहीं होता है आपके प्रोग्राम में सभी जावास्क्रिप्ट एक बार में सामने और केंद्र चलाता है। पर्दे के पीछे क्या होता है ओएस ओओ को संभालता है और नोड तैयार होने के लिए इंतजार करता है और नोड उसकी कतार को निष्पादित करने के लिए इंतजार कर रहा है।

3: जे एस इंजन कैसे जान सकता है कि यह एक एसिंक फ़ंक्शन है, जिससे कि वह इसे इवेंट लूप में रख सकता है?

नोड कोर में फ़ंक्शन का एक निश्चित सेट है जो async हैं क्योंकि वे सिस्टम कॉल करते हैं और नोड को पता है कि ये कौन से हैं क्योंकि उन्हें ओएस या सी ++ कॉल करना पड़ता है असल में सभी नेटवर्क और फाइल सिस्टम IO और साथ ही बाल प्रक्रिया इंटरैक्शन असिंक्रोनस हो सकते हैं और एकमात्र तरीका जावास्क्रिप्ट नोड को कुछ एसिंक्रोनस को चलाने के लिए प्राप्त कर सकता है, नोड कोर लाइब्रेरी द्वारा प्रदान की गई एक async फ़ंक्शन के द्वारा। यहां तक ​​कि अगर आप एक एनपीएम पैकेज का उपयोग कर रहे हैं जो इवेंट लूप उपज देने के लिए स्वयं की एपीआई को परिभाषित करता है, तो अंततः उस एनपीएम पैकेज का कोड नोड कोर के एसिंक कार्यों में से एक को कॉल करेगा और जब नोड जानता है कि टिक पूर्ण हो गया है और यह इवेंट शुरू कर सकता है लूप एल्गोरिदम फिर से

4 इवेंट लूप कॉलबैक फ़ंक्शंस की एक पंक्ति है। जब एक async फ़ंक्शन निष्पादित होता है, तो कॉलबैक फ़ंक्शन कतार में धकेल दिया जाता है। जावास्क्रिप्ट इंजन ईवेंट लूप को प्रसंस्करण प्रारंभ नहीं करता जब तक कि एक async फ़ंक्शन निष्पादित नहीं होता है।

हां, यह सच है, लेकिन यह भ्रामक है मुख्य बात यह है कि सामान्य पैटर्न है:

 //Let's say this code is running in tick 1 fs.readFile("/home/barney/colors.txt", function (error, data) { //The code inside this callback function will absolutely NOT run in tick 1 //It will run in some tick >= 2 }); //This code will absolutely also run in tick 1 //HOWEVER, typically there's not much else to do here, //so at some point soon after queueing up some async IO, this tick //will have nothing useful to do so it will just end because the IO result //is necessary before anything useful can be done 

तो हाँ, आप पूरी तरह से एक ही टिक में सभी स्मृति में सिंक्रोनस फाइबोनैचि संख्याओं की गणना करके ईवेंट लूप को पूरी तरह अवरुद्ध कर सकते हैं, और हाँ कि आपके प्रोग्राम को पूरी तरह से फ्रीज कर देगी। यह सहकारी संगामिति है जावास्क्रिप्ट के हर टिकट को कुछ उचित समय के भीतर ईवेंट लूप प्राप्त करना चाहिए या समग्र आर्किटेक्चर विफल रहता है।

फिलिप रॉबर्ट्स द्वारा एक शानदार वीडियो ट्यूटोरियल है, जो जावास्क्रिप्ट इवेंट लूप को सबसे सरल और वैचारिक तरीके से बताता है। हर जावास्क्रिप्ट डेवलपर को देखना चाहिए।

ये यूट्यूब पर वीडियो लिंक है

मत सोचो कि मेजबान प्रक्रिया एकल-थ्रेडेड हो, वे नहीं हैं। एकल-थ्रेडेड क्या है जो मेजबान प्रक्रिया का हिस्सा है जो आपके जावास्क्रिप्ट कोड को निष्पादित करता है।

पृष्ठभूमि श्रमिकों को छोड़कर, लेकिन ये परिदृश्य को जटिल बनाते हैं …

इसलिए, आपके सभी जेएस कोड एक ही धागे में चलते हैं, और इसमें कोई संभावना नहीं है कि आप अपने जेएस कोड के दो अलग-अलग भागों को एक साथ चलने के लिए लेते हैं (इसलिए, आप संभाल करने के लिए संगामिति नहीं मिलते हैं)।

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

यहाँ मेरा मानसिक प्रतिनिधित्व है (सावधान रहना: यह सिर्फ यही है, मैं ब्राउज़र का विवरण नहीं जानता!) आपके उदाहरण कोड का:

 console.clear(); //exec sync console.log("a"); //exec sync setTimeout( //schedule inAWhile to be executed at now +1 s function inAWhile(){ console.log("b"); },1000); console.log("c"); //exec sync setTimeout( function justNow(){ //schedule justNow to be executed just now console.log("d"); },0); 

यद्यपि आपका कोड चल रहा है, मेजबान प्रक्रिया में एक और थ्रेड सभी सिस्टम इवेंट्स का ट्रैक रखता है जो कि हो रही हैं (यूआई पर क्लिक, फाइल पढ़ने, नेटवर्क पैकेट प्राप्त आदि)

जब आपका कोड पूरा हो जाता है, तो इसे इवेंट लूप से निकाल दिया जाता है, और यह देखने के लिए मेजबान प्रक्रिया वापस आती है, यह देखने के लिए कि चलाने के लिए अधिक कोड हैं या नहीं। इवेंट लूप में दो ईवेंट हैंडलर शामिल हैं: एक को अभी निष्पादित किया जा सकता है (सिर्फ अभी फ़ंक्शन), और दूसरा दूसरा (इन-फ़ंक्शन फ़ंक्शन) के भीतर।

मेजबान प्रक्रिया अब सभी घटनाओं से मिलान करने का प्रयास करती है, यह देखने के लिए कि क्या उनके लिए पंजीकृत हैंडलर पंजीकृत हैं। यह पाया गया कि जिस घटना के लिए अभी इंतजार कर रहा है, वह हुआ है, इसलिए उसे अपना कोड चलाने शुरू हो गया है। जब बस अभी बाहर निकलें फ़ंक्शन, यह ईवेंट लूप को एक और समय की जांच करता है, घटनाओं पर संचालकों के लिए खोज करना। मान लेते हैं कि 1 एस पारित हो गया है, यह समारोह में चल रहा है, और इसी तरह ….