Node.js में मल्टी-थ्रेडिंग और मल्टीपल प्रोसेस के बारे में
इस लेख में, आइए Node.js में मल्टीथ्रेडिंग और मल्टीप्रोसेस के बारे में बात करें, और Node.js में मल्टीथ्रेडिंग और मल्टीप्रोसेस की गहरी समझ प्राप्त करें। एक निश्चित संदर्भ मूल्य है, जरूरतमंद दोस्त इसका उल्लेख कर सकते हैं, मुझे उम्मीद है कि मैं सभी की मदद करूंगा।
NodeJS एक फ्री-टू-यूज़, क्रॉस-प्लेटफ़ॉर्म जावास्क्रिप्ट रनटाइम वातावरण है, जो प्रकृति में सिंगल-थ्रेडेड है, लेकिन एसिंक्रोनस कोड को निष्पादित करने के लिए बैकग्राउंड में कई थ्रेड्स का उपयोग करता है।
Node.js की गैर-अवरुद्ध प्रकृति के कारण, अलग-अलग थ्रेड अलग-अलग कॉलबैक निष्पादित करते हैं जो पहले इवेंट लूप को सौंपे जाते हैं। इस सब को संभालने के लिए NodeJS रनटाइम जिम्मेदार है।
नोडजेएस क्यों?
JS को मूल रूप से एक सिंगल-थ्रेडेड प्रोग्रामिंग भाषा के रूप में बनाया गया था जिसका मतलब केवल एक वेब ब्राउज़र के अंदर चलाना था। इसका मतलब यह है कि एक प्रक्रिया में, निर्देशों का केवल एक सेट एक निश्चित समय पर निष्पादित करने में सक्षम था।
निष्पादन अगले कोड ब्लॉक पर तभी चला गया जब वर्तमान कोड ब्लॉक निष्पादन समाप्त हो गया। हालाँकि, JS की सिंगल-थ्रेडेड प्रकृति ने कार्यान्वयन को आसान बना दिया है।
अपनी विनम्र शुरुआत में, जावास्क्रिप्ट वेबसाइटों पर केवल थोड़ी सी बातचीत जोड़ने के लिए उपयोगी था। इसलिए, ऐसा कुछ भी नहीं था जो मल्टीथ्रेडिंग की मांग करता हो। हालांकि, समय बदल गया है, उपयोगकर्ता की आवश्यकताएं तेज हो गई हैं, और जावास्क्रिप्ट वेब की लोकप्रिय प्रोग्रामिंग भाषा बन गई है।
मल्टीथ्रेडिंग अब आम हो गया है। क्योंकि JS सिंगल थ्रेडेड लैंग्वेज है, इसमें मल्टीथ्रेडिंग हासिल करना संभव नहीं है। शुक्र है, इस स्थिति के लिए एक बढ़िया समाधान उपलब्ध है; नोडजेएस.
कोई कमी नहीं है NodeJS चौखटे जेएस रनटाइम पर्यावरण, विशेष रूप से और सामान्य रूप से जावास्क्रिप्ट द्वारा प्राप्त लोकप्रियता के लिए धन्यवाद। लेख को जारी रखने से पहले, आइए जानते हैं Node.js के बारे में कुछ महत्वपूर्ण बातें:
- सेंड फंक्शन का उपयोग करके फोर्कड प्रोसेस से फोर्क प्रोसेस और मास्टर प्रोसेस को मैसेज पास करना संभव है
- कई प्रक्रियाओं को फोर्क करने के लिए समर्थन उपलब्ध है
- राज्य को मास्टर और फोर्कड प्रक्रियाओं के बीच साझा नहीं किया जाता है
एक प्रक्रिया कांटा क्यों?
दो मामले हैं जब हमें एक प्रक्रिया को फोर्क करने की आवश्यकता होती है:
- कार्यों को किसी अन्य प्रक्रिया में सौंपकर गति बढ़ाने के लिए
- स्मृति को मुक्त करने और एकल प्रक्रिया को उतारने के लिए
फोर्कड प्रक्रिया में डेटा भेजना और इसे वापस भेजना संभव है।
NodeJS का रास्ता
Node.js दो प्रकार के थ्रेड्स का उपयोग करता है:
- इवेंट लूप द्वारा संभाला गया मुख्य धागा और,
- कार्यकर्ता पूल में कई सहायक सूत्र
इवेंट लूप कॉलबैक, या फ़ंक्शंस लेने और भविष्य में निष्पादन के लिए इसे पंजीकृत करने के लिए ज़िम्मेदार है। यह उचित JS कोड के समान थ्रेड में कार्य करता है। एक बार जब कोई JS ऑपरेशन थ्रेड को ब्लॉक कर देता है, तो इवेंट लूप भी ब्लॉक हो जाता है।
वर्कर पूल एक निष्पादन मॉडल है जो विभिन्न धागों को पैदा करने और संभालने के लिए जिम्मेदार है। यह समकालिक रूप से कार्य करता है और फिर परिणाम को इवेंट लूप में लौटाता है, जो तब बताए गए परिणाम के साथ दिए गए कॉलबैक को निष्पादित करता है।
संक्षेप में, वर्कर पूल एसिंक्रोनस I/O ऑपरेशंस यानी सिस्टम डिस्क और नेटवर्क के साथ किए गए इंटरैक्शन का ख्याल रखता है। एफएस और क्रिप्टो जैसे मॉड्यूल मुख्य रूप से वर्कर पूल का उपयोग करते हैं।
msrm वाईफाई रीसेट का विस्तार करें
कार्यकर्ता पूल के रूप में लागू किया गया है लिबव लाइब्रेरी , जब Node.js को JS और C++ के बीच आंतरिक रूप से संवाद करने की आवश्यकता होती है, तो थोड़ी देरी होती है। हालाँकि, यह लगभग अगोचर है।
जब तक हम एक जटिल ऑपरेशन को समकालिक रूप से निष्पादित करने की आवश्यकता को पूरा नहीं करते, तब तक सब कुछ अच्छा है। किसी भी फ़ंक्शन को चलाने के लिए अधिक समय की आवश्यकता होती है, जिसके परिणामस्वरूप मुख्य थ्रेड अवरुद्ध हो जाएगा।
यदि एप्लिकेशन में कई सीपीयू-गहन कार्य हैं, तो इसके परिणामस्वरूप सर्वर के थ्रूपुट में महत्वपूर्ण गिरावट आती है। सबसे खराब स्थिति में, सर्वर फ्रीज हो जाएगा और वर्कर पूल को काम सौंपने का कोई तरीका नहीं होगा।
एआई, बिग डेटा और मशीन लर्निंग जैसे क्षेत्रों को नोडजेएस से लाभ नहीं मिल सका क्योंकि संचालन एक और एकमात्र मुख्य थ्रेड को अवरुद्ध कर रहा था और सर्वर को अनुत्तरदायी बना रहा था। हालाँकि, यह NodeJS v10.5.0 के आगमन के साथ बदल गया जिसने मल्टीथ्रेडिंग के लिए समर्थन जोड़ा।
समवर्ती और सीपीयू-बाध्य कार्यों की चुनौती
जावास्क्रिप्ट में समवर्ती स्थापित करना मुश्किल हो सकता है। कई थ्रेड्स को एक ही मेमोरी परिणाम को दौड़ की स्थिति में एक्सेस करने की अनुमति देना न केवल पुन: पेश करना कठिन है, बल्कि हल करना भी चुनौतीपूर्ण है।
NodeJS को मूल रूप से एसिंक्रोनस I/O पर आधारित सर्वर-साइड प्लेटफॉर्म के रूप में लागू किया गया था। इसने थ्रेड्स की आवश्यकता को समाप्त करके बहुत सी चीजों को आसान बना दिया। हां, Node.js एप्लिकेशन सिंगल-थ्रेडेड होते हैं लेकिन सामान्य तरीके से नहीं।
हम Node.js में चीजों को समानांतर में चला सकते हैं। हालांकि, हमें धागे बनाने की जरूरत नहीं है। ऑपरेटिंग सिस्टम और वर्चुअल मशीन सामूहिक रूप से I / O को समानांतर में चलाते हैं और JS कोड तब एक ही थ्रेड में चलता है जब डेटा को जावास्क्रिप्ट कोड पर वापस भेजने का समय होता है।
JS कोड को छोड़कर, Node.js में सब कुछ समानांतर में चलता है। अतुल्यकालिक ब्लॉकों के विपरीत, JS के सिंक्रोनस ब्लॉक हमेशा एक समय में एक निष्पादित होते हैं। कोड निष्पादन की तुलना में, JS में I/O ईवेंट होने की प्रतीक्षा में बहुत अधिक समय व्यतीत होता है।
एक NodeJS एप्लिकेशन केवल आवश्यक कार्यों, या कॉलबैक को आमंत्रित करता है, और अन्य कोड के निष्पादन को अवरुद्ध नहीं करता है। मूल रूप से, न तो जावास्क्रिप्ट और न ही नोडजेएस सीपीयू-गहन या सीपीयू-बाध्य कार्यों को संभालने के लिए था।
जब कोड न्यूनतम होगा, तो निष्पादन चुस्त होगा। हालाँकि, गणनाएँ जितनी भारी होती जाती हैं, निष्पादन उतना ही धीमा होता जाता है।
यदि आपने अभी भी JS और Node में CPU-गहन कार्यों को पूरा करने का प्रयास किया है, तो इसके परिणामस्वरूप ब्राउज़र में UI को फ्रीज कर दिया गया है और क्रमशः किसी भी I/O ईवेंट को कतारबद्ध कर दिया गया है। बहरहाल, हम इससे बहुत आगे निकल चुके हैं। अब, हमारे पास दिन बचाने के लिए वर्कर_थ्रेड मॉड्यूल है।
वर्कर_थ्रेड्स मॉड्यूल के साथ मल्टीथ्रेडिंग मेड सिंपल
2018 के जून में जारी, Node.js v10.5.0 ने वर्कर_थ्रेड मॉड्यूल पेश किया। यह लोकप्रिय जावास्क्रिप्ट रनटाइम वातावरण में संगामिति को लागू करने की सुविधा प्रदान करता है। मॉड्यूल पूरी तरह कार्यात्मक मल्टीथ्रेडेड NodeJS ऐप्स बनाने की अनुमति देता है।
तकनीकी रूप से, एक वर्कर थ्रेड कुछ कोड होता है जो एक अलग थ्रेड में उत्पन्न होता है। वर्कर थ्रेड्स का उपयोग शुरू करने के लिए, पहले वर्कर_थ्रेड्स मॉड्यूल को आयात करना होगा। बाद में, वर्कर थ्रेड बनाने के लिए वर्कर क्लास का एक इंस्टेंस बनाना होगा।
कार्यकर्ता वर्ग का एक उदाहरण बनाते समय, दो तर्क होते हैं:
- पहला फ़ाइल को पथ प्रदान करता है, जिसमें .js या .mjs एक्सटेंशन होते हैं, जिसमें वर्कर थ्रेड का कोड होता है और,
- दूसरा एक ऑब्जेक्ट प्रदान करता है जिसमें वर्करडेटा संपत्ति होती है जिसमें निष्पादन शुरू होने पर वर्कर थ्रेड द्वारा एक्सेस किया जाने वाला डेटा होता है
वर्कर थ्रेड एक से अधिक संदेश ईवेंट भेजने में सक्षम हैं। जैसे, एक वादा वापस करने के विकल्प पर कॉलबैक दृष्टिकोण को वरीयता दी जाती है।
कार्यकर्ता धागे के बीच संचार घटना-आधारित है यानी श्रोताओं को कार्यकर्ता थ्रेड द्वारा ईवेंट भेजे जाने के तुरंत बाद कॉल करने के लिए सेट किया जाता है। सबसे आम घटनाओं में से 4 हैं:
worker.on('error', (error) => {});
- वर्कर थ्रेड के अंदर एक न आया हुआ अपवाद होने पर उत्सर्जित होता है। इसके बाद, कार्यकर्ता धागा समाप्त हो जाता है, और त्रुटि प्रदान की गई कॉलबैक में पहले तर्क के रूप में उपलब्ध कराई जाती है।
worker.on('exit', (exitCode) => {})
2. एक कार्यकर्ता धागा बाहर निकलने पर उत्सर्जित होता है। यदि कार्यकर्ता थ्रेड के अंदर process.exit () को कॉल किया जाता है, तो निकास कोड कॉलबैक को प्रदान किया जाएगा। कोड 1 है यदि वर्कर.टर्मिनेट () वर्कर थ्रेड को समाप्त करता है।
worker.on('message', (data) => {});
3. जब कोई वर्कर थ्रेड पैरेंट थ्रेड को डेटा भेजता है तो उत्सर्जित होता है।
worker.on('online', () => {});
4. उत्सर्जित जब एक कार्यकर्ता धागा जेएस कोड को पार्स करना बंद कर देता है और निष्पादन शुरू करता है। हालांकि आमतौर पर उपयोग नहीं किया जाता है, ऑनलाइन घटना विशिष्ट परिदृश्यों में जानकारीपूर्ण हो सकती है।
वर्कर थ्रेड्स का उपयोग करने के तरीके
वर्कर थ्रेड्स का उपयोग करने के दो तरीके हैं:
- दृष्टिकोण १ - इसमें वर्कर थ्रेड को स्पॉन करना, उसके कोड को निष्पादित करना और परिणाम को पैरेंट थ्रेड को भेजना शामिल है। यह दृष्टिकोण एक नए कार्य के लिए हर बार खरोंच से एक नया कार्यकर्ता बनाने के लिए आवश्यक है।
- दृष्टिकोण २ - संदेश घटना के लिए एक कार्यकर्ता धागा पैदा करना और श्रोताओं को स्थापित करना शामिल है। हर बार जब संदेश निकाल दिया जाता है, तो कार्यकर्ता धागा कोड को निष्पादित करता है और परिणाम को मूल धागे में वापस भेजता है। भविष्य के उपयोग के लिए कार्यकर्ता धागा जीवित रहता है।
दृष्टिकोण 2 को वर्कर पूल के रूप में भी जाना जाता है। ऐसा इसलिए है क्योंकि इस दृष्टिकोण में श्रमिकों का एक पूल बनाना, उन्हें प्रतीक्षा में रखना और आवश्यकता पड़ने पर कार्य करने के लिए संदेश घटना को भेजना शामिल है।
क्योंकि स्क्रैच से वर्कर थ्रेड बनाना वर्चुअल मशीन बनाने और कोड को पार्स करने और निष्पादित करने की मांग करता है, आधिकारिक NodeJS प्रलेखन दृष्टिकोण 2 को नियोजित करने की सिफारिश करता है। इसके अलावा, दृष्टिकोण 2 दृष्टिकोण 1 की तुलना में अधिक कुशल है।
वर्कर_थ्रेड्स मॉड्यूल में उपलब्ध महत्वपूर्ण गुण
- isMainThread - वर्कर थ्रेड के अंदर काम नहीं करते समय यह गुण सत्य है। यदि आवश्यक हो, तो कार्यकर्ता फ़ाइल की शुरुआत में एक साधारण अगर कथन शामिल किया जा सकता है। यह सुनिश्चित करता है कि यह केवल एक वर्कर थ्रेड के रूप में चलता है।
- पैरेंटपोर्ट - MessagePort का एक उदाहरण, इसका उपयोग पैरेंट थ्रेड के साथ संचार करने के लिए किया जाता है।
- थ्रेड आईडी - वर्कर थ्रेड को असाइन किया गया एक यूनिक आइडेंटिफ़ायर।
- कार्यकर्ता डेटा - स्पॉनिंग थ्रेड द्वारा वर्कर थ्रेड के कंस्ट्रक्टर में शामिल डेटा शामिल है।
NodeJS में मल्टीप्रोसेसिंग
Node.js का उपयोग करके मल्टी-कोर सिस्टम की शक्ति का उपयोग करने के लिए, प्रक्रियाएं उपलब्ध हैं। लोकप्रिय जेएस रनटाइम वातावरण में क्लस्टर नामक एक मॉड्यूल होता है जो मल्टीप्रोसेसिंग के लिए समर्थन प्रदान करता है।
क्लस्टर मॉड्यूल कई चाइल्ड प्रक्रियाओं को उत्पन्न करने में सक्षम बनाता है, जो एक सामान्य पोर्ट साझा कर सकते हैं। जब बच्चे की प्रक्रियाओं को क्रियान्वित किया जाता है तो NodeJS का उपयोग करने वाला एक सिस्टम अधिक कार्यभार को संभाल सकता है।
बैकएंड के लिए Node.js
इंटरनेट पहले से ही दुनिया भर में अरबों नहीं तो लाखों लोगों की पसंद का मंच बन चुका है। इसलिए, किसी व्यवसाय को उसकी अधिकतम क्षमता तक ले जाने के लिए और उसके कारण में कोई कसर नहीं छोड़ने के लिए एक मजबूत ऑनलाइन उपस्थिति होना अनिवार्य है।
यह सब एक शक्तिशाली, सहज ज्ञान युक्त वेबसाइट से शुरू होता है। एक त्रुटिहीन वेबसाइट बनाने के लिए सबसे अच्छा फ्रंटएंड और बैकएंड तकनीकों का चयन करना महत्वपूर्ण है। हालांकि प्रकृति में सिंगल-थ्रेडेड, Node.js के कारण में एक शीर्ष विकल्प है बैकएंड वेब विकास सेवाएं .
बहु-थ्रेडेड बैकएंड विकल्पों की बहुतायत होने के बावजूद, प्रतिष्ठित कंपनियां NodeJS को चुनना पसंद करती हैं। ऐसा इसलिए है क्योंकि Node.js जावास्क्रिप्ट में मल्टीथ्रेडिंग का उपयोग करने के लिए वर्कअराउंड प्रदान करता है, जो पहले से ही वेब की सबसे लोकप्रिय प्रोग्रामिंग भाषा है।
निष्कर्ष
वर्कर_थ्रेड मॉड्यूल Node.js अनुप्रयोगों में मल्टीथ्रेडिंग को लागू करने का एक आसान तरीका प्रदान करता है। सीपीयू-भारी गणनाओं को वर्कर थ्रेड्स को सौंपकर सर्वर के थ्रूपुट को काफी बढ़ाया जा सकता है।
मल्टीथ्रेडिंग के लिए नए समर्थन के साथ, NodeJS अधिक से अधिक डेवलपर्स, इंजीनियरों और गणना-भारी क्षेत्रों जैसे AI, बिग डेटा और मशीन लर्निंग के अन्य पेशेवरों तक पहुंचना जारी रखेगा।
#नोडज #जावास्क्रिप्ट #मल्टी-थ्रेडिंग #मल्टीपल-प्रोसेस