सामान्य तौर पर, Node.js 10,000 समवर्ती अनुरोधों को कैसे संभालता है?


393

मैं समझता हूं कि Node.js एकल-थ्रेड और ईवेंट लूप का उपयोग केवल एक ही समय में एक (जो गैर-अवरोधक है) को संसाधित करने के लिए अनुरोध करने के लिए करता है। लेकिन फिर भी, वह काम कैसे करता है, 10,000 समवर्ती अनुरोधों को कहने देता है। ईवेंट लूप सभी अनुरोधों को संसाधित करेगा? क्या यह बहुत लंबा नहीं होगा?

मैं (अभी तक) समझ नहीं पा रहा हूं कि यह एक बहु-थ्रेडेड वेब सर्वर से कैसे तेज हो सकता है। मैं समझता हूं कि बहु-थ्रेडेड वेब सर्वर संसाधनों (मेमोरी, सीपीयू) में अधिक महंगा होगा, लेकिन क्या यह अभी भी तेज नहीं होगा? मैं शायद गलत हूं; कृपया बताएं कि यह सिंगल-थ्रेड बहुत सारे अनुरोधों में कैसे तेज है, और यह आम तौर पर (उच्च स्तर पर) क्या करता है जब 10,000 जैसे बहुत सारे अनुरोधों की सेवा करता है।

और यह भी, कि बड़ी राशि के साथ यह एकल-धागा पैमाना होगा? कृपया ध्यान रखें कि मैं Node.js. सीखना शुरू कर रहा हूँ


4
क्योंकि अधिकांश काम (चारों ओर डेटा घूमना) में सीपीयू शामिल नहीं है।
ऑरेंजडॉग

4
यह भी ध्यान दें कि सिर्फ इसलिए कि जावास्क्रिप्ट को निष्पादित करने वाला केवल एक धागा है, इसका मतलब यह नहीं है कि काम करने वाले अन्य धागे बहुत सारे नहीं हैं।
ऑरेंजडॉग

यह प्रश्न या तो बहुत व्यापक है, या विभिन्न अन्य प्रश्नों की नकल है।
ऑरेंजडॉग


सिंगल थ्रेडिंग के साथ, Node.js कुछ ऐसा करता है जिसे "नॉन ब्लॉकिंग आई / ओ" कहा जाता है। यहाँ है जहाँ सभी जादू किया जाता है
आनंद एन

जवाबों:


762

यदि आपको यह प्रश्न पूछना है तो आप शायद इस बात से अपरिचित हैं कि अधिकांश वेब एप्लिकेशन / सेवाएं क्या करते हैं। आप शायद सोच रहे हैं कि सभी सॉफ्टवेयर ऐसा करते हैं:

user do an action
       
       v
 application start processing action
   └──> loop ...
          └──> busy processing
 end loop
   └──> send result to user

हालाँकि, यह नहीं है कि वेब अनुप्रयोग, या बैक-एंड के रूप में डेटाबेस के साथ वास्तव में कोई भी अनुप्रयोग कैसे काम करता है। वेब ऐप्स ऐसा करते हैं:

user do an action
       
       v
 application start processing action
   └──> make database request
          └──> do nothing until request completes
 request complete
   └──> send result to user

इस परिदृश्य में, सॉफ़्टवेयर अपने चल रहे अधिकांश समय को 0% CPU समय का उपयोग करके डेटाबेस के वापस लौटने के लिए प्रतीक्षा कर रहा है।

बहुस्तरीय नेटवर्क ऐप:

मल्टीथ्रेडेड नेटवर्क ऐप इस तरह उपरोक्त वर्कलोड को संभालते हैं:

request ──> spawn thread
              └──> wait for database request
                     └──> answer request
request ──> spawn thread
              └──> wait for database request
                     └──> answer request
request ──> spawn thread
              └──> wait for database request
                     └──> answer request

इसलिए थ्रेड अपना ज्यादातर समय 0% CPU का उपयोग करके डेटा के वापस आने के लिए डेटाबेस के इंतजार में बिताते हैं। ऐसा करते समय उन्हें एक थ्रेड के लिए आवश्यक मेमोरी आवंटित करनी होती है, जिसमें प्रत्येक थ्रेड आदि के लिए एक पूरी तरह से अलग प्रोग्राम स्टैक शामिल होता है। इसके अलावा, उन्हें एक थ्रेड शुरू करना होगा, जो उतना महंगा नहीं है, जितना एक फुल प्रोसेस शुरू करना अभी भी ठीक नहीं है सस्ता।

सिंगलथ्रेड इवेंट लूप

चूँकि हम अपना अधिकांश समय 0% CPU का उपयोग करते हैं, इसलिए जब हम CPU का उपयोग नहीं कर रहे हैं तो कुछ कोड क्यों नहीं चलाते हैं? इस तरह, प्रत्येक अनुरोध को अभी भी बहु-स्तरीय अनुप्रयोगों के रूप में सीपीयू समय की एक ही राशि मिलेगी, लेकिन हमें एक धागा शुरू करने की आवश्यकता नहीं है। तो हम यह करते हैं:

request ──> make database request
request ──> make database request
request ──> make database request
database request complete ──> send response
database request complete ──> send response
database request complete ──> send response

व्यवहार में दोनों दृष्टिकोण लगभग एक ही विलंबता के साथ रिटर्न डेटा है क्योंकि यह डेटाबेस प्रतिक्रिया समय है जो प्रसंस्करण पर हावी है।

यहाँ मुख्य लाभ यह है कि हमें एक नए धागे की आवश्यकता नहीं है, इसलिए हमें बहुत सारे और बहुत सारे मॉलोक करने की ज़रूरत नहीं है जो हमें धीमा कर देगा।

जादू, अदृश्य थ्रेडिंग

प्रतीत होता है रहस्यमय बात यह है कि उपरोक्त दोनों दृष्टिकोण "समानांतर" में कार्यभार चलाने के लिए कैसे प्रबंधित करते हैं? इसका उत्तर यह है कि डेटाबेस थ्रेडेड है। इसलिए हमारा एकल-थ्रेडेड ऐप वास्तव में एक और प्रक्रिया के बहु-थ्रेडेड व्यवहार का लाभ उठा रहा है: डेटाबेस।

जहां सिंगलथ्रेड अप्रोच विफल रहता है

यदि डेटा वापस करने से पहले आपको बहुत सारे CPU गणना करने की आवश्यकता होती है, तो एक एकलथ्रेड ऐप बड़ा विफल हो जाता है। अब, मैं डेटाबेस परिणाम के लिए लूप प्रसंस्करण के लिए मतलब नहीं है। वह अभी भी ज्यादातर O (n) है। मेरा मतलब है कि फूरियर ट्रांसफॉर्म करने (उदाहरण के लिए एमपी 3 एन्कोडिंग), रे ट्रेसिंग (3 डी रेंडरिंग) आदि जैसी चीजें हैं।

सिंगलथ्रेड एप्स का एक और नुकसान यह है कि यह केवल सिंगल सीपीयू कोर का उपयोग करेगा। इसलिए यदि आपके पास क्वाड-कोर सर्वर है (असामान्य नहीं) तो आप अन्य 3 कोर का उपयोग नहीं कर रहे हैं।

जहां बहुस्तरीय दृष्टिकोण विफल हो जाता है

यदि आप प्रति थ्रेड RAM बहुत आवंटित करने की आवश्यकता है, तो एक multithreaded एप्लिकेशन बड़ा विफल रहता है। सबसे पहले, रैम उपयोग का मतलब है कि आप एक एकल ऐप के रूप में कई अनुरोधों को संभाल नहीं सकते हैं। इससे भी बदतर, मलोच धीमा है। बहुत सारी और बहुत सी वस्तुओं को आवंटित करना (जो कि आधुनिक वेब फ्रेमवर्क के लिए सामान्य है) का मतलब है कि हम संभावित रूप से सिंगलथ्रेड एप्स की तुलना में धीमी गति से समाप्त हो सकते हैं। यह वह जगह है जहाँ नोड.जेएस आमतौर पर जीतते हैं।

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

इसलिए यदि आप सी या गो या जावा में नेटवर्क ऐप लिख रहे हैं तो थ्रेडिंग का ओवरहेड आमतौर पर बहुत बुरा नहीं होगा। यदि आप PHP या रूबी की सेवा के लिए एक सी वेब सर्वर लिख रहे हैं तो जावास्क्रिप्ट या रूबी या पायथन में एक तेज़ सर्वर लिखना बहुत आसान है।

हाइब्रिड दृष्टिकोण

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

कुछ एकल-थ्रेडेड आर्किटेक्चर भी हाइब्रिड दृष्टिकोण का उपयोग करते हैं। एक प्रक्रिया से कई थ्रेड लॉन्च करने के बजाय आप कई एप्लिकेशन लॉन्च कर सकते हैं - उदाहरण के लिए, क्वाड-कोर मशीन पर 4 नोड। जेएस सर्वर। फिर आप प्रक्रियाओं के बीच काम का बोझ फैलाने के लिए एक लोड बैलेंसर का उपयोग करते हैं।

प्रभाव में दो दृष्टिकोण एक दूसरे के तकनीकी रूप से समान दर्पण-चित्र हैं।


104
यह नोड के लिए अब तक का सबसे अच्छा स्पष्टीकरण है जो मैंने अब तक पढ़ा है। यही कारण है कि "एकल पिरोया एप्लिकेशन वास्तव में एक और प्रक्रिया की बहु लड़ी व्यवहार का लाभ होता है: डेटाबेस।" काम किया है
kenobiwan

क्या होगा अगर क्लाइंट नोड में कई अनुरोध कर रहा है, उदाहरण के लिए एक नाम प्राप्त करना और इसे संशोधित करना, और यह कहना कि यह ऑपरेशन बहुत सारे क्लाइंट द्वारा बहुत तेजी से हैंडल करने के लिए सर्वर को धक्का देता है। मैं ऐसे परिदृश्य को कैसे संभाल सकता हूं?
2

3
@CaspainCaldion यह इस बात पर निर्भर करता है कि आप बहुत तेज और बहुत सारे ग्राहकों से क्या मतलब रखते हैं। जैसा कि, नोड.जेएस प्रति सेकंड 1000 अनुरोधों के ऊपर की प्रक्रिया कर सकता है और गति केवल आपके नेटवर्क कार्ड की गति तक सीमित है। ध्यान दें कि यह प्रति सेकंड 1000 अनुरोध है जो क्लाइंट एक साथ नहीं जुड़े हैं। यह बिना समस्या के 10000 ग्राहकों को एक साथ संभाल सकता है। असली अड़चन नेटवर्क कार्ड है।
स्लीपबेटमैन

1
@slebetman, अब तक का सबसे अच्छा स्पष्टीकरण। एक बात हालांकि, अगर मेरे पास मशीन लर्निंग एल्गोरिदम है जो कुछ जानकारी को संसाधित करता है और तदनुसार परिणाम देता है, तो क्या मुझे मल्टी थ्रेडेड दृष्टिकोण या सिंगल थ्रेडेड का उपयोग करना चाहिए
गणेश करेवड

5
@GaneshKarewad एल्गोरिदम CPU, सेवाओं (डेटाबेस, REST API आदि) का उपयोग I / O करते हैं। यदि AI js में लिखा एक एल्गोरिथ्म है, तो आपको इसे किसी अन्य थ्रेड या प्रक्रिया में चलाना चाहिए। यदि AI किसी अन्य कंप्यूटर (जैसे Amazon या Google या IBM AI सेवाओं) पर चलने वाली सेवा है, तो एकल थ्रेडेड आर्किटेक्चर का उपयोग करें।
स्लीपबेटमैन

46

आप जो सोच रहे हैं, वह यह है कि अधिकांश प्रोसेसिंग नोड ईवेंट लूप में संभाला जाता है। नोड वास्तव में थ्रेड्स के लिए I / O कार्य को दूर करता है। मैं / ओ संचालन आमतौर पर सीपीयू संचालन की तुलना में अधिक समय तक परिमाण के आदेश लेते हैं, इसलिए सीपीयू की प्रतीक्षा क्यों है? इसके अलावा, OS I / O कार्यों को पहले से ही अच्छी तरह से संभाल सकता है। वास्तव में, क्योंकि नोड इसके चारों ओर इंतजार नहीं करता है, यह बहुत अधिक सीपीयू उपयोग को प्राप्त करता है।

सादृश्य के अनुसार, NodeJS को एक वेटर के रूप में सोचें जो ग्राहक के आदेश ले रहा है जबकि I / O शेफ उन्हें रसोई में तैयार करते हैं। अन्य प्रणालियों में कई शेफ होते हैं, जो ग्राहकों का ऑर्डर लेते हैं, भोजन तैयार करते हैं, मेज को साफ करते हैं और उसके बाद ही अगले ग्राहक के पास जाते हैं।


5
रेस्तरां सादृश्य के लिए धन्यवाद! मुझे लगता है कि उपमा और वास्तविक दुनिया के उदाहरणों से सीखना बहुत आसान है।
लावाचे

13

मैं समझता हूं कि Node.js एकल-थ्रेड और ईवेंट लूप का उपयोग केवल एक ही समय में एक (जो गैर-अवरोधक है) को संसाधित करने के लिए अनुरोध करने के लिए करता है।

मैं गलत समझ सकता हूं कि आपने यहां क्या कहा है, लेकिन "एक बार में" ऐसा लगता है जैसे आप घटना-आधारित वास्तुकला को पूरी तरह से नहीं समझ रहे होंगे।

एक "पारंपरिक" (गैर-घटना-संचालित) एप्लिकेशन आर्किटेक्चर में, प्रक्रिया बहुत समय बिताती है ताकि कुछ होने की प्रतीक्षा में बैठे रहें। इस तरह के Node.js के रूप में एक घटना आधारित वास्तुकला में प्रक्रिया बस इंतजार नहीं करता है, यह अन्य काम के साथ मिल सकता है।

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

इन चरणों में से प्रत्येक पर, अधिकांश समय कुछ डेटा के दूसरे छोर से आने के इंतजार में बिताया जाता है - मुख्य JS थ्रेड में वास्तविक समय बिताया प्रसंस्करण आमतौर पर काफी कम होता है।

जब I / O ऑब्जेक्ट (जैसे नेटवर्क कनेक्शन) की स्थिति बदल जाती है, तो उसे प्रोसेसिंग की आवश्यकता होती है (जैसे कि सॉकेट पर डेटा प्राप्त होता है, सॉकेट लेखन योग्य हो जाता है, आदि) मुख्य Node.js JS थ्रेड को एक सूची के साथ जगाया जाता है जिन वस्तुओं को संसाधित करने की आवश्यकता है।

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

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

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

मेरे दिमाग में, इसका मुख्य लाभ यह है कि एक धीमे अनुरोध (जैसे आप 2G डेटा कनेक्शन पर एक मोबाइल फोन डिवाइस पर 1MB प्रतिक्रिया डेटा भेजने की कोशिश कर रहे हैं, या आप वास्तव में धीमा डेटाबेस क्वेरी कर रहे हैं) टी तेजी से ब्लॉक।

एक पारंपरिक बहु-थ्रेडेड वेब सर्वर में, आपके पास आमतौर पर प्रत्येक अनुरोध के लिए एक थ्रेड होगा, और यह केवल उस अनुरोध को पूरा करने तक की प्रक्रिया करेगा। यदि आपके पास बहुत सारे धीमे अनुरोध हैं तो क्या होगा? आप इन अनुरोधों को संसाधित करने के लिए अपने बहुत सारे थ्रेड्स के साथ समाप्त होते हैं, और अन्य अनुरोध (जो बहुत ही सरल अनुरोध हो सकते हैं जो बहुत तेज़ी से निपट सकते हैं) उनके पीछे कतारबद्ध हो जाते हैं।

Node.js के अलावा कई अन्य इवेंट-आधारित सिस्टम हैं, और वे पारंपरिक मॉडल के साथ समान फायदे और नुकसान करते हैं।

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


12

सिंगल थ्रेडेड इवेंट लूप मॉडल प्रोसेसिंग चरण:

  • ग्राहक वेब सर्वर को अनुरोध भेजें।

  • नोड जेएस वेब सर्वर आंतरिक रूप से क्लाइंट अनुरोधों को सेवाएं प्रदान करने के लिए एक सीमित थ्रेड पूल रखता है।

  • नोड जेएस वेब सर्वर उन अनुरोधों को प्राप्त करता है और उन्हें एक कतार में रखता है। इसे "ईवेंट कतार" के रूप में जाना जाता है।

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

  • इवेंट लूप केवल सिंगल थ्रेड का उपयोग करता है। यह नोड जेएस प्लेटफ़ॉर्म प्रोसेसिंग मॉडल का मुख्य दिल है।

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

  • यदि हाँ, तो इवेंट क्यू से एक क्लाइंट रिक्वेस्ट चुनें

    1. क्लाइंट अनुरोध को संसाधित करता है
    2. यदि वह क्लाइंट रिक्वेस्ट किसी ब्लॉकिंग आईओ ऑपरेशंस की आवश्यकता नहीं है, तो सब कुछ प्रोसेस करें, प्रतिक्रिया तैयार करें और इसे क्लाइंट को वापस भेजें।
    3. अगर उस क्लाइंट रिक्वेस्ट के लिए कुछ ब्लॉकिंग IO ऑपरेशंस की आवश्यकता होती है जैसे डेटाबेस, फाइल सिस्टम, एक्सटर्नल सर्विसेज के साथ इंटरैक्ट करना तो वह अलग-अलग दृष्टिकोण का पालन करेगा
  • आंतरिक थ्रेड पूल से थ्रेड की उपलब्धता की जाँच करता है
  • एक थ्रेड ऊपर उठाता है और इस ग्राहक अनुरोध को उस थ्रेड में असाइन करता है।
  • थ्रेड उस अनुरोध को लेने के लिए ज़िम्मेदार है, इसे प्रोसेस करें, ब्लॉकिंग आईओ ऑपरेशन करें, प्रतिक्रिया तैयार करें और इसे इवेंट लूप पर वापस भेजें

    बहुत अच्छी तरह से समझाया @Rambabu Posa द्वारा अधिक स्पष्टीकरण के लिए इस लिंक को फेंक दें


उस ब्लॉग पोस्ट में दिए गए आरेख गलत प्रतीत होते हैं, उन्होंने उस लेख में जो उल्लेख किया है वह पूरी तरह से सही नहीं है।
rranj

11

स्लीबेटमैन उत्तर में जोड़ना: जब आप कहते Node.JSहैं कि 10,000 समवर्ती अनुरोधों को संभाल सकते हैं तो वे अनिवार्य रूप से गैर-अवरुद्ध अनुरोध हैं अर्थात ये अनुरोध डेटाबेस क्वेरी से संबंधित हैं।

आंतरिक रूप से, event loopके Node.JSएक से निपटने है thread pool, जहां प्रत्येक धागा एक संभालती है non-blocking requestऔर घटना पाश की धागा से एक के लिए काम सौंपने के बाद अधिक अनुरोध को सुनने के लिए जारी है thread pool। जब थ्रेड में से एक काम पूरा हो जाता है, तो यह एक संकेत भेजता है event loopकि यह उर्फ ​​समाप्त हो गया है callbackEvent loopफिर इस कॉलबैक को संसाधित करें और प्रतिक्रिया वापस भेजें।

चूंकि आप NodeJS में नए हैं, इसलिए इसके बारे में अधिक पढ़ें nextTick यह समझने के लिए कि ईवेंट लूप आंतरिक रूप से कैसे काम करता है। पर ब्लॉग पढ़ें http://javascriptissexy.com , वे मेरे लिए वास्तव में मददगार थे जब मैं जावास्क्रिप्ट / NodeJS साथ शुरू कर दिया।


2

स्लीवेटमैन से जोड़नाकोड को निष्पादित करते समय क्या होता है, इस बारे में अधिक स्पष्टता के लिए के उत्तर ।

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

अब यहाँ एक और जानकारी मिलती है कि इसकी एक बार कॉलबैक कतार नहीं है, कई कतारें हैं।

  1. NextTick कतार
  2. सूक्ष्म कार्य कतार
  3. टाइमर कतार
  4. आईओ कॉलबैक कतार (अनुरोध, फ़ाइल ऑप्स, डीबी ऑप्स)
  5. आईओ पोल कतार
  6. चरण कतार या सेटमाइमेट की जाँच करें
  7. करीब संचालकों की कतार

जब भी कोई अनुरोध आता है तो कॉलबैक के इस क्रम में कोड निष्पादित हो जाता है।

यह ऐसा नहीं है जब एक अवरुद्ध अनुरोध होता है यह एक नए धागे से जुड़ा होता है। डिफ़ॉल्ट रूप से केवल 4 धागे हैं। इसलिए वहां एक और कतार लग रही है।

जब भी किसी कोड में फाइल रीडिंग जैसी ब्लॉकिंग प्रक्रिया होती है, तो एक फ़ंक्शन को कॉल करता है जो थ्रेड पूल से थ्रेड का उपयोग करता है और फिर एक बार ऑपरेशन किया जाता है, कॉलबैक को संबंधित कतार में पास किया जाता है और फिर ऑर्डर में निष्पादित किया जाता है।

सब कुछ कॉलबैक के प्रकार के आधार पर कतारबद्ध हो जाता है और ऊपर वर्णित क्रम में संसाधित होता है।

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