नोड जेएस में इवेंट लूप

Noda Je Esa Mem Iventa Lupa



Node.js एक शक्तिशाली जावास्क्रिप्ट फ्रेमवर्क है जो उपयोगकर्ताओं को ब्राउज़र के बाहर सर्वर पर जावास्क्रिप्ट कोड चलाने में सक्षम बनाता है। यह विश्वसनीय स्केलेबल वेब अनुप्रयोगों के निर्माण के लिए एक गैर-अवरुद्ध, इवेंट-संचालित रनटाइम वातावरण है। इवेंट लूप Node.js का एक महत्वपूर्ण हिस्सा है जो आपको दूसरे को शुरू करने से पहले एक के खत्म होने का इंतजार किए बिना कार्य करने में सक्षम बनाता है।

हालाँकि जावास्क्रिप्ट एक एकल-थ्रेडेड भाषा है, Node.js ऑपरेटिंग सिस्टम को कार्य सौंप सकता है, जिससे यह एक ही समय में कई कार्यों को संसाधित करने की अनुमति देता है। कई कार्यों को एक ही समय में पूरा करना पड़ता है क्योंकि ऑपरेटिंग सिस्टम में ऑपरेशन मल्टी-थ्रेडेड होते हैं। प्रत्येक ऑपरेशन से जुड़े कॉलबैक को इवेंट कतार में जोड़ा जाता है और निर्दिष्ट कार्य पूरा होने पर चलाने के लिए Node.js द्वारा निर्धारित किया जाता है।

कुशल और विश्वसनीय Node.js कोड लिखने के लिए, उपयोगकर्ता को इवेंट लूप की ठोस समझ होनी चाहिए। यह प्रदर्शन समस्याओं का प्रभावी ढंग से निवारण करने में भी मदद कर सकता है। Node.js में इवेंट लूप मेमोरी बचाता है और आपको प्रत्येक कार्य के समाप्त होने की प्रतीक्षा किए बिना एक साथ कई काम करने की अनुमति देता है। शब्द 'एसिंक्रोनस' किसी भी जावास्क्रिप्ट फ़ंक्शन को संदर्भित करता है जो आने वाले अनुरोधों को अवरुद्ध किए बिना पृष्ठभूमि में चलता है।







इवेंट लूप पर सीधे जाने से पहले आइए जावास्क्रिप्ट प्रोग्रामिंग भाषा के विभिन्न पहलुओं पर एक नज़र डालें।



जावास्क्रिप्ट एक अतुल्यकालिक प्रोग्रामिंग भाषा के रूप में

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



अवधारणा को समझने के लिए एक सरल कोड उदाहरण दिया गया है।





फ़ंक्शन विधि1 ( ) {

सांत्वना देना। लकड़ी का लट्ठा ( 'फ़ंक्शन 1' )

}

फ़ंक्शन विधि2 ( ) {

सांत्वना देना। लकड़ी का लट्ठा ( 'फ़ंक्शन 2' )

}

विधि 1 ( )

विधि 2 ( )

इस कोड में, दो सरल फ़ंक्शन बनाए जाते हैं और पहले मेथड1 को कॉल किया जाता है, इसलिए यह पहले मेथड1 को लॉग करेगा और फिर अगले पर जाएगा।

उत्पादन



जावास्क्रिप्ट एक तुल्यकालिक प्रोग्रामिंग भाषा के रूप में

जावास्क्रिप्ट एक तुल्यकालिक प्रोग्रामिंग भाषा है और प्रत्येक पंक्ति को चरण दर चरण ऊपर से नीचे की ओर निष्पादित करती है, एक समय में केवल एक पंक्ति निष्पादित होती है। ऊपर दिए गए उदाहरण में विधि 1 को पहले टर्मिनल में लॉग किया जाता है और फिर विधि 2 को।

जावास्क्रिप्ट एक अवरोधक भाषा के रूप में

एक तुल्यकालिक भाषा होने के कारण जावास्क्रिप्ट में एक अवरोधक कार्यक्षमता होती है। इससे कोई फर्क नहीं पड़ता कि चल रही प्रक्रिया को पूरा करने में कितना समय लगता है, लेकिन एक नई प्रक्रिया तब तक शुरू नहीं की जाएगी जब तक कि पिछली प्रक्रिया पूरी न हो जाए। उपरोक्त कोड उदाहरण में मान लीजिए कि विधि 1 में बहुत सारी कोड स्क्रिप्ट है, चाहे इसमें 10 सेकंड या एक मिनट का कितना भी समय लगे, विधि 2 तब तक निष्पादित नहीं होगी जब तक कि विधि 1 में सभी कोड निष्पादित नहीं हो जाते।

ब्राउजिंग के दौरान यूजर्स को इसका अनुभव हुआ होगा। जब कोई वेब एप्लिकेशन किसी ब्राउज़र में बैक-एंड में निष्पादित होता है तो कोड का एक बड़ा हिस्सा निष्पादित हो रहा होता है, इसलिए उपयोगकर्ता को नियंत्रण पहुंच वापस करने से पहले ब्राउज़र कुछ समय के लिए रुका हुआ प्रतीत होता है। इस व्यवहार को अवरोधन के रूप में जाना जाता है. जब तक वर्तमान अनुरोध संसाधित नहीं हो जाता, ब्राउज़र किसी भी आने वाले अनुरोध पर विचार नहीं कर सकता।

जावास्क्रिप्ट एक एकल-थ्रेडेड भाषा है

जावास्क्रिप्ट में किसी प्रोग्राम को चलाने के लिए थ्रेड कार्यक्षमता का उपयोग किया जाता है। थ्रेड्स एक समय में केवल एक ही कार्य करने में सक्षम हैं। अन्य प्रोग्रामिंग भाषाएं मल्टी-थ्रेडिंग का समर्थन करती हैं और समानांतर में कई कार्य चला सकती हैं, जावास्क्रिप्ट में किसी भी कोड स्क्रिप्ट को निष्पादित करने के लिए केवल एक थ्रेड होता है।

जावास्क्रिप्ट में प्रतीक्षा की जा रही है

जैसा कि इस अनुभाग में नाम से स्पष्ट है, हमें आगे बढ़ने के लिए अपने अनुरोध के संसाधित होने तक प्रतीक्षा करनी होगी। प्रतीक्षा में कई मिनट लग सकते हैं जिसके दौरान किसी भी अन्य अनुरोध पर विचार नहीं किया जाता है। यदि कोड स्क्रिप्ट प्रतीक्षा किए बिना आगे बढ़ती है तो कोड में एक त्रुटि आ जाएगी। कोड को एसिंक्रोनस बनाने के लिए कुछ कार्यक्षमता को जावास्क्रिप्ट या विशेष रूप से Node.js में लागू किया जाना है।

अब जब हम जावास्क्रिप्ट के विभिन्न पहलुओं को समझ गए हैं, तो आइए कुछ सरल उदाहरणों से सिंक्रोनस और एसिंक्रोनस को समझें।

जावास्क्रिप्ट में कोड का समकालिक निष्पादन

सिंक्रोनस का मतलब है कि कोड को क्रमिक रूप से या अधिक सरलता से चरण-दर-चरण ऊपर से शुरू करके और लाइन दर लाइन नीचे की ओर निष्पादित किया जाता है।

नीचे एक उदाहरण दिया गया है जो समझने में मदद कर सकता है:

//एप्लिकेशन.जेएस

सांत्वना देना। लकड़ी का लट्ठा ( 'एक' )

सांत्वना देना। लकड़ी का लट्ठा ( 'दो' )

सांत्वना देना। लकड़ी का लट्ठा ( 'तीन' )

इस कोड में, तीन कंसोल.लॉग स्टेटमेंट हैं जिनमें से प्रत्येक कुछ न कुछ प्रिंट कर रहा है। सबसे पहले कंसोल में 'वन' प्रिंट करने वाला पहला स्टेटमेंट 1 एमएस (अनुमानित) के लिए कॉल स्टैक में भेजा जाता है, फिर इसे टर्मिनल पर लॉग किया जाता है। उसके बाद, दूसरे स्टेटमेंट को कॉल स्टैक में धकेल दिया जाता है और अब समय पिछले से एक जोड़कर 2 एमएस है और फिर यह कंसोल पर 'दो' लॉग करता है। अंत में, अंतिम कथन को कॉल स्टैक में धकेल दिया जाता है, अब समय 3ms है और यह कंसोल में 'तीन' लॉग करता है।

उपरोक्त कोड को निम्नलिखित कमांड को लागू करके निष्पादित किया जा सकता है:

नोड अनुप्रयोग. जे एस

उत्पादन

कार्यप्रणाली को ऊपर विस्तार से समझाया गया है और इसे ध्यान में रखते हुए आउटपुट को पलक झपकते ही कंसोल में लॉग किया जाता है:

जावास्क्रिप्ट में कोड का अतुल्यकालिक निष्पादन

अब हम कॉलबैक शुरू करके और कोड को एसिंक्रोनस बनाकर उसी कोड को रिफैक्टर करते हैं। उपरोक्त कोड को इस प्रकार पुनः क्रियान्वित किया जा सकता है:

//एप्लिकेशन.जेएस
फ़ंक्शन प्रिंटवन ( वापस बुलाओ ) {
सेटटाइमआउट ( समारोह ( ) {
सांत्वना देना। लकड़ी का लट्ठा ( 'एक' ) ;
वापस बुलाओ ( ) ;
} , 1000 ) ;
}
फ़ंक्शन प्रिंटटू ( वापस बुलाओ ) {
सेटटाइमआउट ( समारोह ( ) {
सांत्वना देना। लकड़ी का लट्ठा ( 'दो' ) ;
वापस बुलाओ ( ) ;
} , 2000 ) ;
}
फ़ंक्शन प्रिंटथ्री ( ) {
सेटटाइमआउट ( समारोह ( ) {
सांत्वना देना। लकड़ी का लट्ठा ( 'तीन' ) ;
} , 3000 ) ;
}
सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम की शुरुआत' ) ;
printOne ( समारोह ( ) {
प्रिंटदो ( समारोह ( ) {
तीन प्रिंट करें ( ) ;
} ) ;
} ) ;
सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम का अंत' ) ;

उपरोक्त इस कोड में:

  • 'एक', 'दो' और 'तीन' प्रिंट करने के लिए तीन फ़ंक्शन घोषित किए गए हैं, प्रत्येक फ़ंक्शन में एक कॉलबैक पैरामीटर होता है जो कोड के क्रमिक निष्पादन की अनुमति देता है।
  • सेटटाइमआउट फ़ंक्शन का उपयोग करके एक टाइमआउट सेट किया गया है और एक विशिष्ट देरी के बाद प्रिंटिंग के लिए एक कंसोल.लॉग स्टेटमेंट है।
  • दो संदेश मुद्रित होते हैं 'कार्यक्रम का प्रारंभ' और 'कार्यक्रम का अंत' जो कार्यक्रम की शुरुआत और अंत को दर्शाते हैं।
  • प्रोग्राम 'प्रोग्राम की शुरुआत' प्रिंट करके शुरू होता है जिसके बाद printOne फ़ंक्शन को 1-सेकंड की देरी के साथ निष्पादित किया जाता है, फिर printTwo फ़ंक्शन को 2-सेकंड की देरी के साथ निष्पादित किया जाता है, और अंत में printThree फ़ंक्शन को 3-सेकंड की देरी के साथ निष्पादित किया जाता है। देरी।
  • प्रोग्राम सेटटाइमआउट फ़ंक्शंस के अंदर एसिंक्रोनस कोड निष्पादन की प्रतीक्षा नहीं करता है जो एक, दो और तीन को प्रिंट करने से पहले 'प्रोग्राम का अंत' कथन लॉग करता है।

उत्पादन

टर्मिनल में इस कमांड को निष्पादित करके उपरोक्त कोड चलाएँ:

नोड अनुप्रयोग. जे एस

अब टर्मिनल में आउटपुट एसिंक्रोनस रूप से इस प्रकार दिखाई देगा:

अब जब हमें सिंक्रोनस और एसिंक्रोनस निष्पादन की पूरी समझ हो गई है तो आइए Node.js में इवेंट लूप की अपनी अवधारणा को मजबूत करने के लिए आगे बढ़ें।

Node.js: इवेंट लूप मैकेनिज्म

सिंक्रोनस और एसिंक्रोनस दोनों कार्यों का निष्पादन Node.js में इवेंट लूप द्वारा प्रबंधित किया जाता है। Node.js प्रोजेक्ट लॉन्च होते ही निष्पादन शुरू हो जाता है और जटिल कार्यों को सिस्टम में आसानी से स्थानांतरित कर देता है। यह सुनिश्चित करता है कि अन्य कार्य मुख्य थ्रेड पर सुचारू रूप से चल सकें।

Node.js में इवेंट लूप का दृश्य स्पष्टीकरण

Node.js में ईवेंट लूप निरंतर और अर्ध-अनंत है। इवेंट लूप को Node.js कोड स्क्रिप्ट की शुरुआत से शुरू किया जाता है, और यह एसिंक एपीआई कॉल करने और प्रक्रियाओं को कॉल करने के लिए ज़िम्मेदार है। टिक(), और शेड्यूलिंग टाइमर फिर इवेंट लूप के निष्पादन को फिर से शुरू करता है।

Node.js में, पांच मुख्य प्रकार की कतारें कॉलबैक को संभालती हैं:

  • 'टाइमर कतार' जिसे आमतौर पर मिन-हीप के रूप में जाना जाता है, 'सेटटाइमआउट' और 'सेटइंटरवल' से जुड़े कॉलबैक को संभालने के लिए जिम्मेदार है।
  • 'एफएस' और 'एचटीटीपी' मॉड्यूल जैसे अतुल्यकालिक संचालन के लिए कॉलबैक 'आई/ओ क्यू' द्वारा नियंत्रित किए जाते हैं।
  • 'चेक क्यू' में 'सेटइमीडिएट' फ़ंक्शन के लिए कॉलबैक शामिल हैं जो नोड के लिए अद्वितीय है।
  • 'बंद कतार' किसी भी अतुल्यकालिक कार्य के समापन कार्यक्रम से जुड़े कॉलबैक का प्रबंधन करती है।
  • अंत में, 'माइक्रो टास्क' कतार में दो अलग-अलग कतारें हैं:
    • 'नेक्स्टटिक' कतार में 'प्रोसेस.नेक्स्टटिक' फ़ंक्शन से जुड़े कॉलबैक शामिल हैं।
    • 'वादा' कतार मूल वादे से संबंधित कॉलबैक को नियंत्रित करती है।

Node.js में इवेंट लूप कार्यक्षमता

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

माइक्रोटास्क कतार में कॉलबैक को सर्वोच्च प्राथमिकता दी जाती है, फिर नेक्स्टटिक कतार में कार्यों को निष्पादित करने के लिए आगे बढ़ाया जाता है और उसके बाद प्रॉमिस कतार में कार्यों को निष्पादित किया जाता है। फिर टाइमर की कतार कॉलबैक में प्रक्रियाओं को नियंत्रित किया जाता है जिसके बाद प्रत्येक टाइमर कॉलबैक के बाद माइक्रोटास्क कतार पर दोबारा गौर किया जाता है। I/O, चेक और क्लोज़ कतारों में कॉलबैक को प्रत्येक चरण के बाद देखी गई माइक्रोटास्क कतार के समान पैटर्न में निष्पादित किया जाता है।

यदि प्रक्रिया के लिए अधिक कॉलबैक हैं तो लूप निष्पादित होता रहता है। जब कोड स्क्रिप्ट समाप्त हो जाती है या प्रक्रिया के लिए कोई कॉलबैक नहीं बचता है, तो इवेंट लूप कुशलतापूर्वक समाप्त हो जाता है।

अब जब हम इवेंट लूप को गहराई से समझ गए हैं, तो आइए इसकी विशेषताओं पर नजर डालें।

Node.js में इवेंट लूप की विशेषताएं

मुख्य विशेषताएं हैं:

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

इवेंट लूप की गहन समझ और एसिंक्रोनस और सिंक्रोनस निष्पादन के तर्क के बाद, विभिन्न चरणों की समझ प्राप्त करने से इवेंट लूप की अवधारणाएं मजबूत हो सकती हैं।

Node.js इवेंट लूप चरण

जैसा कि ऊपर बताया गया है, इवेंट लूप अर्ध-अनंत है। इसके कई चरण होते हैं लेकिन कुछ चरणों का उपयोग आंतरिक संचालन के लिए किया जाता है। इन चरणों का कोड स्क्रिप्ट पर कोई प्रभाव नहीं पड़ता है।

इवेंट लूप क्यू की कार्यक्षमता का अनुसरण करता है और फर्स्ट-इन और फर्स्ट-आउट के सिद्धांत पर कार्य को निष्पादित करता है। निर्धारित टाइमर समाप्त होने तक ऑपरेटिंग सिस्टम द्वारा नियंत्रित किए जाएंगे। फिर समाप्त हो चुके टाइमर को टाइमर के लिए कॉलबैक कतार में जोड़ दिया जाता है।

इवेंट लूप टाइमर की कतार में कार्यों को एक-एक करके तब तक निष्पादित करता है जब तक कि कोई और कार्य शेष न रह जाए या यह कार्यों की अधिकतम अनुमत संख्या तक न पहुंच जाए। नीचे दिए गए अनुभागों में इवेंट लूप के मुख्य चरणों की व्याख्या की गई है।

टाइमर चरण

Node.js में एक टाइमर एपीआई है जो भविष्य में निष्पादित होने वाले कार्यों को शेड्यूल कर सकता है। आवंटित समय बीत जाने के बाद टाइमर कॉलबैक शेड्यूल होते ही निष्पादित हो जाएगा; हालाँकि, ऑपरेटिंग सिस्टम की ओर से या अन्य कॉलबैक के निष्पादन के कारण देरी का सामना करना पड़ सकता है।

टाइमर एपीआई के तीन मुख्य कार्य हैं:

  • सेटटाइमआउट
  • सेटतत्काल
  • सेटअंतराल

उपर्युक्त कार्य समकालिक हैं। इवेंट लूप में टाइमर चरण का दायरा सेटटाइमआउट और सेटइंटरवल फ़ंक्शंस तक सीमित है। जबकि चेक फ़ंक्शन setImmediate फ़ंक्शन को संभालता है।

आइए सैद्धांतिक भाग को मजबूत करने के लिए एक सरल उदाहरण पर विचार करें:

//एप्लिकेशन.जेएस

फ़ंक्शन विलंबित फ़ंक्शन ( ) {

सांत्वना देना। लकड़ी का लट्ठा ( 'विलंबित फ़ंक्शन टाइमआउट के बाद निष्पादित किया जाता है' ) ;

}

सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम की शुरुआत' ) ;

सेटटाइमआउट ( विलंबितफ़ंक्शन, 2000 ) ;

सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम का अंत' ) ;

इस कोड में:

  • प्रोग्राम टर्मिनल पर 'प्रोग्राम की शुरुआत' स्टेटमेंट लॉग करके शुरू होता है।
  • फिर विलंबित फ़ंक्शन को 2ms के टाइमर के साथ कॉल किया जाता है, कोड स्क्रिप्ट रुकती नहीं है और पृष्ठभूमि में देरी को संभालने के लिए आगे बढ़ती है।
  • कथन 'कार्यक्रम का अंत पहले कथन के बाद लॉग किया जाता है।
  • 2 एमएस की देरी के बाद, डिलेडफंक्शन में स्टेटमेंट टर्मिनल पर लॉग किया जाता है।

उत्पादन

आउटपुट इस प्रकार दिखाई देगा:

यह देखा जा सकता है कि विलंबित फ़ंक्शन को संसाधित करने के लिए कोड को रोका नहीं गया है; यह आगे बढ़ता है और देरी के बाद, फ़ंक्शन कॉलबैक संसाधित होता है।

लंबित कॉलबैक

इवेंट लूप मतदान चरण में होने वाली घटनाओं की जाँच करता है, जैसे फ़ाइलें पढ़ना, नेटवर्क गतिविधियाँ, या इनपुट/आउटपुट कार्य। यह जानना महत्वपूर्ण है कि, Node.js में, इस मतदान चरण में केवल कुछ घटनाओं को ही संभाला जाता है। हालाँकि, इवेंट लूप के बाद के पुनरावृत्ति में, कुछ घटनाओं को लंबित चरण के लिए स्थगित किया जा सकता है। यह एक महत्वपूर्ण अवधारणा है जिसे Node.js कोड को अनुकूलित और समस्या निवारण करते समय ध्यान में रखना चाहिए जिसमें जटिल इवेंट-संचालित ऑपरेशन शामिल हैं।

यह समझना महत्वपूर्ण है कि प्रतीक्षा कॉलबैक चरण के दौरान, ईवेंट लूप लंबित कॉलबैक की कतार में स्थगित घटनाओं को जोड़ता है और उन्हें निष्पादित करता है। यह चरण सिस्टम द्वारा उत्पन्न कुछ टीसीपी सॉकेट त्रुटियों को भी संभालता है, जैसे कि कुछ ऑपरेटिंग सिस्टम पर ECONNREFUSED त्रुटि घटनाएं।

अवधारणा को मजबूत करने के लिए नीचे एक उदाहरण का उल्लेख किया गया है:

//एप्लिकेशन.जेएस
कॉन्स्ट एफ.एस = ज़रूरत होना ( 'एफएस' ) ;
फ़ंक्शन readFileAsync ( फ़ाइलपथ, कॉलबैक ) {
एफ.एस. फ़ाइल पढ़ें ( './PromiseText.txt' , 'utf8' , समारोह ( त्रुटि, डेटा ) {
अगर ( ग़लती होना ) {
सांत्वना देना। गलती ( ` गलती फ़ाइल पढ़ना : $ { ग़लती संदेश } ` ) ;
} अन्य {
सांत्वना देना। लकड़ी का लट्ठा ( ` फ़ाइल सामग्री : $ { डेटा } ` ) ;
}
वापस बुलाओ ( ) ;
} ) ;
}
सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम की शुरुआत' ) ;
readFileAsync ( './PromiseText.txt' , समारोह ( ) {
सांत्वना देना। लकड़ी का लट्ठा ( 'फ़ाइल रीड कॉलबैक निष्पादित' ) ;
} ) ;
सांत्वना देना। लकड़ी का लट्ठा ( 'कार्यक्रम का अंत' ) ;

इस कोड में:

  • प्रोग्राम को टर्मिनल में 'प्रोग्राम की शुरुआत' स्टेटमेंट लॉग करके शुरू किया जाता है।
  • 'PromiseText.txt' फ़ाइल की सामग्री को पढ़ने के लिए readFileAsync को अतुल्यकालिक रूप से परिभाषित किया गया है। यह एक पैरामीट्रिज्ड फ़ंक्शन है जो फ़ाइल पढ़ने के बाद कॉलबैक फ़ंक्शन निष्पादित करता है।
  • फ़ाइल पढ़ने की प्रक्रिया शुरू करने के लिए readFileAsync फ़ंक्शन को कॉल किया जाता है।
  • फ़ाइल पढ़ने की प्रक्रिया में, प्रोग्राम रुकता नहीं है; इसके बजाय, यह अगले स्टेटमेंट पर आगे बढ़ता है और इसे 'प्रोग्राम के अंत' टर्मिनल में लॉग करता है।
  • फ़ाइल रीडिंग की अतुल्यकालिक घटना को इवेंट लूप द्वारा पृष्ठभूमि में संसाधित किया जाता है।
  • फ़ाइल को एसिंक्रोनस रूप से पढ़ने और सामग्री को टर्मिनल पर लॉग करने के बाद प्रोग्राम फ़ाइल सामग्री को टर्मिनल पर लॉग करता है। उसके बाद, यह निम्न संदेश लॉग करता है 'फ़ाइल रीड कॉलबैक निष्पादित'।
  • इवेंट लूप अगले चरण में लंबित कॉलबैक ऑपरेशंस को संभालता है।

उत्पादन

उपरोक्त निष्पादन का परिणाम है:

निष्क्रिय, Node.js में चरण तैयार करें

निष्क्रिय चरण का उपयोग Node.js में आंतरिक कार्यों से निपटने के लिए किया जाता है, इसलिए यह एक मानक चरण नहीं है। यह कोड स्क्रिप्ट को प्रभावित नहीं करता. निष्क्रिय चरण इवेंट लूप के लिए एक ब्रेक अवधि की तरह है जिसके दौरान पृष्ठभूमि में कम-प्राथमिकता वाले कार्यों का प्रबंधन किया जाता है। इस चरण को समझने के लिए एक सरल उदाहरण है:

कॉन्स्ट { निठल्ला } = ज़रूरत होना ( 'निष्क्रिय-जीसी' ) ;

निठल्ला। अनदेखा करना ( ) ;

इस कोड में, 'आइडल-जीसी' मॉड्यूल का उपयोग किया जाता है जो निष्क्रिय चरण को अनदेखा करने की अनुमति देता है। यह उन स्थितियों को संभालने में काम आता है जब इवेंट लूप व्यस्त होता है और पृष्ठभूमि कार्य नहीं किए जाते हैं। Idle.ignore का उपयोग इष्टतम नहीं माना जाता है क्योंकि यह प्रदर्शन संबंधी समस्याएं पैदा कर सकता है।

Node.js में मतदान चरण

Node.js में मतदान चरण इस प्रकार कार्य करता है:

  • यह मतदान कतार में घटनाओं को संभालता है और उनके संबंधित कार्य करता है।
  • यह तय करता है कि प्रक्रिया में I/O संचालन के लिए प्रतीक्षा और जाँच में कितना समय व्यतीत करना है।

जैसे ही इवेंट लूप टाइमर की अनुपस्थिति के कारण मतदान चरण में प्रवेश करेगा, नीचे दिए गए कार्यों में से एक निष्पादित किया जाएगा:

  • Node.js में इवेंट लूप के पोल चरण में, लंबित I/O इवेंट को कतारबद्ध किया जाता है और फिर कतार खाली होने तक फ़र्स्ट इन और फ़र्स्ट आउट के सिद्धांत का पालन करते हुए क्रमिक प्रक्रिया में निष्पादित किया जाता है। कॉलबैक निष्पादन के दौरान नेक्स्टटिक और माइक्रोटास्क कतारें भी क्रियाशील होती हैं। यह सुचारुता सुनिश्चित करता है और I/O संचालन को अधिक कुशलतापूर्वक और विश्वसनीय रूप से संभालने की अनुमति देता है।
  • यदि कतार खाली है और स्क्रिप्ट को setImmediate() फ़ंक्शन द्वारा शेड्यूल नहीं किया गया है तो इवेंट लूप समाप्त हो जाएगा और यह अगले चरण (चेक) पर आगे बढ़ेगा। दूसरी ओर, यदि स्क्रिप्ट शेड्यूलिंग setImmediate() फ़ंक्शन द्वारा की गई है तो इवेंट लूप कॉलबैक को कतार में जोड़ने की अनुमति देता है जिसे इसके द्वारा निष्पादित किया जाएगा।

इसे एक सरल कोड उदाहरण के साथ सबसे अच्छी तरह चित्रित किया गया है:

सेटटाइमआउट ( ( ) => {

सांत्वना देना। लकड़ी का लट्ठा ( 'Async ऑपरेशन पूरा हुआ' ) ;

} , 2000 ) ;

सांत्वना देना। लकड़ी का लट्ठा ( 'शुरू करना' ) ;

सेटतत्काल ( ( ) => {

सांत्वना देना। लकड़ी का लट्ठा ( 'सेटइमीडिएट कॉलबैक निष्पादित' ) ;

} ) ;

सांत्वना देना। लकड़ी का लट्ठा ( 'अंत' ) ;

इस कोड में:

  • दो संदेश 'प्रारंभ' और 'अंत' कार्यक्रम की शुरुआत और समाप्ति को दर्शाते हैं।
  • सेटटाइमआउट () फ़ंक्शन 2 एमएस की देरी के साथ कॉलबैक फ़ंक्शन सेट करता है और टर्मिनल पर 'एसिंक ऑपरेशन पूरा हुआ' लॉग करता है।
  • टर्मिनल पर स्टार्ट संदेश लॉग होने के बाद setImmediate() फ़ंक्शन 'setImmediate कॉलबैक निष्पादित' संदेश को टर्मिनल पर लॉग करता है।

उत्पादन

आउटपुट संदेशों को केवल एक मिनट के अवलोकन के साथ दिखाएगा कि 'Async ऑपरेशन पूरा हुआ' में समय लगता है और 'समाप्ति' संदेश के बाद मुद्रित होता है:

Node.js जाँच चरण

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

पोल चरण निष्पादन पूरा होने के बाद कॉलबैक निष्पादन की योजना बनाने के लिए libuv API का उपयोग किया जाता है। कोड निष्पादन के दौरान, इवेंट लूप पोल चरण में प्रवेश करता है जिसमें यह आने वाले कनेक्शन अनुरोधों की प्रतीक्षा करता है। दूसरे मामले में यदि कॉलबैक setImmediate() फ़ंक्शन का उपयोग करके शेड्यूल किया गया है और पोल चरण बिना किसी गतिविधि के समाप्त हो जाता है तो यह प्रतीक्षा करने के बजाय चेक चरण में चला जाएगा। समझने के लिए नीचे दिए गए उदाहरण पर विचार करें:

//एप्लिकेशन.जेएस

सांत्वना देना। लकड़ी का लट्ठा ( 'शुरू करना' ) ;

सेटतत्काल ( ( ) => {

सांत्वना देना। लकड़ी का लट्ठा ( 'तत्काल कॉलबैक' ) ;

} ) ;

सांत्वना देना। लकड़ी का लट्ठा ( 'अंत' ) ;

इस कोड में टर्मिनल पर तीन संदेश लॉग ऑन होते हैं। SetImmediate() फ़ंक्शन अंततः संदेश लॉग करने के लिए कॉलबैक भेजता है ' तत्काल कॉलबैक 'टर्मिनल के लिए.

उत्पादन

उपरोक्त कोड का आउटपुट निम्नलिखित क्रम में दिखाई देगा:

Node.js कॉलबैक बंद करें

Node.js इवेंट को बंद करने और इवेंट लूप पुनरावृत्ति को समाप्त करने के लिए कॉलबैक चलाने के लिए इस करीबी चरण का उपयोग करता है। कनेक्शन बंद होने के बाद, ईवेंट लूप इस चरण में समापन ईवेंट को संभालता है। इवेंट लूप के इस चरण में, 'नेक्स्टटिक ()' और माइक्रोटास्क अन्य चरणों की तरह ही उत्पन्न और संसाधित होते हैं।

प्रोसेस.एग्जिट फ़ंक्शन का उपयोग किसी भी समय इवेंट लूप को समाप्त करने के लिए किया जाता है। इवेंट लूप किसी भी लंबित अतुल्यकालिक संचालन की उपेक्षा करेगा और Node.js प्रक्रिया समाप्त हो जाएगी।

विचार करने के लिए एक सरल उदाहरण है:

//एप्लिकेशन.जेएस
कॉन्स्ट जाल = ज़रूरत होना ( 'जाल' ) ;
कॉन्स्ट सर्वर = जाल। क्रिएटसर्वर ( ( सॉकेट ) => {
सॉकेट. पर ( 'बंद करना' , ( ) => {
सांत्वना देना। लकड़ी का लट्ठा ( 'सॉकेट बंद' ) ;
} ) ;
सॉकेट. पर ( 'डेटा' , ( डेटा ) => {
सांत्वना देना। लकड़ी का लट्ठा ( 'प्राप्त डेटा:' , डेटा। स्ट्रिंग ( ) ) ;
} ) ;
} ) ;
सर्वर. पर ( 'बंद करना' , ( ) => {
सांत्वना देना। लकड़ी का लट्ठा ( 'सर्वर बंद' ) ;
} ) ;
कॉन्स्ट पत्तन = 3000 ;
सर्वर. सुनना ( पत्तन, ( ) => {
सांत्वना देना। लकड़ी का लट्ठा ( `सर्वर पोर्ट $ पर सुन रहा है { पत्तन } ` ) ;
} ) ;
सेटटाइमआउट ( ( ) => {
सांत्वना देना। लकड़ी का लट्ठा ( '10 सेकंड के बाद सर्वर बंद हो रहा है' ) ;
सर्वर. बंद करना ( ) ;
प्रक्रिया। बाहर निकलना ( ) ;
} , 10000 ) ;

इस कोड में:

  • स्थिरांक नेट = आवश्यकता ('नेट') ' टीसीपी सर्वर को संभालने के लिए आवश्यक नेट मॉड्यूल आयात करता है और ' कॉन्स्ट सर्वर = नेट.क्रिएटसर्वर((सॉकेट) => { ” एक नया टीसीपी सर्वर इंस्टेंस बनाता है।
  • सॉकेट.ऑन('बंद करें', () => {... } ' सभी सॉकेट पर 'बंद करें' सुनता है। जब सॉकेट कनेक्शन बंद हो जाता है तो टर्मिनल पर 'सॉकेट बंद' संदेश लॉग हो जाता है।
  • सॉकेट.ऑन('डेटा', (डेटा) => {} सभी व्यक्तिगत सॉकेट से आने वाले डेटा की जांच करता है और इसे '.toString()' फ़ंक्शन का उपयोग करके प्रिंट करता है।
  • सर्वर.ऑन('बंद करें', () => {...} सर्वर पर ही 'बंद करें' ईवेंट की जांच करता है, और जब सर्वर कनेक्शन बंद हो जाता है तो यह टर्मिनल पर 'सर्वर बंद' संदेश लॉग करता है।
  • सर्वर.सुनें(पोर्ट, () => {...} ”पोर्ट पर आने वाले कनेक्शनों को सुनता है।
  • सेटटाइमआउट(() => {...} 'सर्वर को बंद करने के लिए 10 एमएस का टाइमर सेट करता है।

यह Node.js में इवेंट लूप के विभिन्न चरणों पर चर्चा समाप्त करता है। किसी निष्कर्ष पर पहुंचने से पहले आइए एक आखिरी बात पर चर्चा करें कि Node.js में इवेंट लूप से कैसे बाहर निकलें।

Node.js में इवेंट लूप से बाहर निकलना

इवेंट लूप तब तक निष्पादन चरण में है जब तक इवेंट लूप चरणों की सभी कतारों में कुछ कार्य मौजूद हैं। निकास चरण समाप्त होने के बाद ईवेंट लूप समाप्त हो जाता है और यदि कोई और कार्य कतार में नहीं है तो निकास श्रोता कॉलबैक वापस आ जाता है।

इवेंट लूप को समाप्त करने का स्पष्ट तरीका '.exit' विधि का उपयोग करना है। जैसे ही प्रोसेस.एग्जिट फ़ंक्शन को कॉल किया जाएगा, Node.js की सक्रिय प्रक्रियाएं तुरंत समाप्त हो जाएंगी। सभी निर्धारित और लंबित ईवेंट हटा दिए जाएंगे:

प्रक्रिया। पर ( 'बाहर निकलना' , ( कोड ) => {

सांत्वना देना। लकड़ी का लट्ठा ( `निकास कोड के साथ बाहर निकलना : $ { कोड } ` ) ;

} ) ;

प्रक्रिया। बाहर निकलना ( 1 ) ;

उपयोगकर्ता .exit फ़ंक्शन को सुन सकते हैं। यह ध्यान दिया जाना चाहिए कि '.exit' फ़ंक्शन समकालिक होना चाहिए क्योंकि Node.js प्रोग्राम इस घटना को सुनते ही बाहर निकल जाएगा।

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

निष्कर्ष

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