Nodejs इवेंट लूप


141

नोडज आर्किटेक्चर में आंतरिक रूप से दो इवेंट लूप हैं?

  • libev / libuv
  • v8 जावास्क्रिप्ट इवेंट लूप

I / O अनुरोध पर, नोड को libeio करने का अनुरोध कतारबद्ध करता है, जो बदले में libev का उपयोग करके घटनाओं के माध्यम से डेटा की उपलब्धता को सूचित करता है और अंत में उन घटनाओं को कॉलबैक का उपयोग करके v8 इवेंट लूप द्वारा नियंत्रित किया जाता है?

मूल रूप से, libj और libeio नोडज आर्किटेक्चर में कैसे एकीकृत हैं?

क्या नोडज की आंतरिक वास्तुकला की स्पष्ट तस्वीर देने के लिए कोई दस्तावेज उपलब्ध है?

जवाबों:


175

मैं व्यक्तिगत रूप से नोड का स्रोत कोड पढ़ रहा हूं। जेएस और वी 8।

जब मैं देशी मॉड्यूल लिखने के लिए नोड.जेएस आर्किटेक्चर को समझने की कोशिश करता हूं तो मैं भी आपकी तरह ही एक समस्या में चला गया।

मैं यहां जो पोस्ट कर रहा हूं वह नोड की मेरी समझ है। जेएस और यह थोड़ा सा ट्रैक भी हो सकता है।

  1. लीबव एक इवेंट लूप है जो वास्तव में सरल ईवेंट लूप ऑपरेशन करने के लिए नोड.जेएस में आंतरिक रूप से चलता है। यह मूल रूप से * nix सिस्टम के लिए लिखा गया है। Libev प्रक्रिया को चलाने के लिए एक सरल लेकिन अनुकूलित इवेंट लूप प्रदान करता है। आप यहाँ libev के बारे में अधिक पढ़ सकते हैं ।

  2. LibEio इनपुट आउटपुट को अतुल्यकालिक रूप से करने के लिए एक लाइब्रेरी है। यह फ़ाइल वर्णनकर्ता, डेटा संचालकों, सॉकेट आदि आप यहाँ इसके बारे में अधिक पढ़ सकते हैं संभालती है यहाँ

  3. LibUv libeio, libev, c-ares (DNS के लिए) और iocp (विंडोज़ एसिंक्रोनस-io के लिए) के शीर्ष पर एक अमूर्त परत है। LibUv इवेंट पूल में सभी io और घटनाओं का प्रदर्शन, रखरखाव और प्रबंधन करता है। (लिबायो थ्रेडपूल के मामले में)। आपको libUv पर रयान डाहल के ट्यूटोरियल की जाँच करनी चाहिए । यह आपके बारे में अधिक समझ बनाने लगेगा कि कैसे libUv खुद काम करता है और फिर आप समझेंगे कि lib.v और v8 के शीर्ष पर नोड कैसे काम करता है।

बस जावास्क्रिप्ट इवेंट लूप को समझने के लिए आपको इन वीडियो को देखने पर विचार करना चाहिए

यह देखने के लिए कि लिबासियो का उपयोग नोड के साथ कैसे किया जाता है। async मॉड्यूल बनाने के लिए आपको इस उदाहरण को देखना चाहिए ।

मूल रूप से नोड.जेएस के अंदर क्या होता है कि v8 लूप सभी जावास्क्रिप्ट भागों के साथ-साथ C ++ मॉड्यूल को भी चलाता है और संभालता है [जब वे एक मुख्य धागे में चल रहे होते हैं (आधिकारिक प्रलेखन नोड के अनुसार। स्वयं ही थ्रेडेड होता है]]। जब मुख्य धागे के बाहर, libev और libeio इसे थ्रेड पूल में संभालते हैं और libev मुख्य लूप के साथ सहभागिता प्रदान करते हैं। तो मेरी समझ से, नोड .js में 1 स्थायी ईवेंट लूप है: यह v8 ईवेंट लूप है। C ++ async कार्यों को संभालने के लिए यह एक थ्रेडपूल का उपयोग कर रहा है [libeio & libev के माध्यम से]।

उदाहरण के लिए:

eio_custom(Task,FLAG,AfterTask,Eio_REQUEST);

जो सभी मॉड्यूल में प्रकट होता है, आमतौर पर Taskथ्रेडपूल में फ़ंक्शन को बुला रहा है । जब यह पूरा हो जाता है, तो यह AfterTaskफ़ंक्शन को मुख्य थ्रेड में कॉल करता है। जबकि Eio_REQUESTअनुरोध हैंडलर है जो एक संरचना / वस्तु हो सकती है जिसका मकसद थ्रेडपूल और मुख्य धागे के बीच संचार प्रदान करना है।


इस तथ्य पर भरोसा करते हुए कि libuv आंतरिक रूप से libev का उपयोग करता है, आपके कोड को क्रॉस प्लेटफ़ॉर्म नहीं बनाने का एक अच्छा तरीका है। आपको केवल लिबव के सार्वजनिक इंटरफ़ेस की परवाह करनी चाहिए।
रेयानोस

1
@ रेयानोस लेबुव का लक्ष्य अपने एक्स-प्लैटफॉसिंग कई पुस्तकालयों को सुनिश्चित करना है। सही ? इसलिए libuv का उपयोग करना एक अच्छा विचार है
ShrekOverflow

1
@ डॉक्टर से डॉक्टर process.nextTick- इवेंट लूप के चारों ओर अगले लूप पर इस कॉलबैक को कॉल करें। यह सेटटाइमआउट (एफएन, 0) के लिए एक साधारण उपनाम नहीं है, यह बहुत अधिक कुशल है। यह किस इवेंट लूप को संदर्भित करता है? V8 इवेंट लूप?
तमिल


4
क्या इस घटना को 'देखने' का कोई तरीका है? आईडी को स्टैक पर कॉल के आदेश को देखने और नए कार्यों को देखने के लिए सक्षम किया जा सकता है ताकि बेहतर हो सके कि क्या हो रहा है ... क्या कोई चर है जो आपको बताता है कि ईवेंट कतार में धकेल दिया गया है?
तारबे सिप

20

ऐसा लगता है कि चर्चा की गई कुछ संस्थाओं (जैसे: कामदेव आदि) ने प्रासंगिकता खो दी है, इस तथ्य के कारण कि यह कुछ समय हो गया है, लेकिन मुझे लगता है कि प्रश्न में अभी भी बहुत संभावनाएं हैं।

मुझे आज के रूप में, नोड के संदर्भ में, सार UNIX वातावरण में, एक अमूर्त उदाहरण की मदद से ईवेंट संचालित मॉडल के कार्य को समझाने का प्रयास करने दें।

कार्यक्रम का परिप्रेक्ष्य:

  • स्क्रिप्ट इंजन स्क्रिप्ट का निष्पादन शुरू करता है।
  • किसी भी समय सीपीयू बाउंड ऑपरेशन का सामना करना पड़ता है, इसे पूर्णता में इनलाइन (वास्तविक मशीन) निष्पादित किया जाता है।
  • किसी भी समय I / O बाध्य ऑपरेशन का सामना करना पड़ता है, अनुरोध और उसके पूरा होने वाले हैंडलर को 'ईवेंट मशीनरी' (वर्चुअल मशीन) के साथ पंजीकृत किया जाता है
  • जब तक स्क्रिप्ट समाप्त नहीं हो जाती तब तक उसी तरीके से संचालन दोहराएं। सीपीयू बाउंड ऑपरेशन - इन-लाइन निष्पादित करें, मैं / ओ बाध्य हैं, ऊपर के रूप में मशीनरी से अनुरोध करते हैं।
  • जब I / O पूरा हो जाता है, श्रोताओं को वापस बुलाया जाता है।

ऊपर दी गई घटना मशीनरी को लिबव एके इवेंट लूप फ्रेमवर्क कहा जाता है। नोड अपने कार्यक्रम संचालित प्रोग्रामिंग मॉडल को लागू करने के लिए इस लाइब्रेरी का लाभ उठाता है।

नोड का परिप्रेक्ष्य:

  • रनटाइम होस्ट करने के लिए एक धागा है।
  • उपयोगकर्ता स्क्रिप्ट उठाओ।
  • इसे देशी [लीवर v8] में संकलित करें
  • बाइनरी लोड करें, और प्रवेश बिंदु में कूदें।
  • संकलित कोड प्रोग्रामिंग प्राइमेटिव का उपयोग करके, सीपीयू बाध्य गतिविधियों को इन-लाइन निष्पादित करता है।
  • कई I / O और टाइमर से संबंधित कोड में मूल रैप होते हैं। उदाहरण के लिए, नेटवर्क I / O।
  • इसलिए I / O कॉल स्क्रिप्ट से C ++ पुलों पर रूट किए जाते हैं, I / O हैंडल के साथ और पूरा हैंडलर तर्क के रूप में पारित हो जाता है।
  • मूल कोड libuv लूप का अभ्यास करता है। यह लूप का अधिग्रहण करता है, एक निम्न स्तर की घटना की पुष्टि करता है जो I / O का प्रतिनिधित्व करता है, और लिबास लूप संरचना में एक देशी कॉलबैक आवरण।
  • मूल कोड स्क्रिप्ट पर वापस लौटता है - नहीं I / O फिलहाल लिया जाता है!
  • उपरोक्त आइटम को कई बार दोहराया जाता है, जब तक कि सभी गैर-I / O कोड निष्पादित नहीं हो जाते, और सभी I / O कोड पंजीकृत हो जाते हैं।
  • अंत में, जब निष्पादित करने के लिए सिस्टम में कुछ भी नहीं बचा है, तो नोड ने libuv पर नियंत्रण पारित किया है
  • लिंबुव एक्शन में आता है, यह सभी पंजीकृत घटनाओं को उठाता है, उनकी संचालन क्षमता प्राप्त करने के लिए ऑपरेटिंग सिस्टम पर सवाल उठाता है।
  • जो लोग गैर-अवरोधक मोड में I / O के लिए तैयार हैं, उन्हें उठाया जाता है, I / O का प्रदर्शन किया जाता है, और उनके कॉलबैक जारी किए जाते हैं। एक के बाद एक।
  • जो अभी तक तैयार नहीं हैं (उदाहरण के लिए एक सॉकेट पढ़ा जाता है, जिसके लिए दूसरे छोर पर अभी तक कुछ भी नहीं लिखा गया है) ओएस के साथ उपलब्ध होने तक जारी रहेगा।
  • लूप आंतरिक रूप से एक बढ़ते टाइमर को बनाए रखता है। जब एक आस्थगित कॉलबैक के लिए आवेदन अनुरोध (जैसे सेटटाइमआउट), कॉलबैक फायरिंग के लिए सही समय की गणना करने के लिए इस आंतरिक टाइमर मूल्य का लाभ उठाया जाता है।

जबकि अधिकांश कार्यक्षमताओं को इस तरीके से पूरा किया जाता है, फ़ाइल संचालन के कुछ (async संस्करण) अतिरिक्त थ्रेड्स की मदद से किए जाते हैं, जो कि लिबव में एकीकृत होते हैं। जबकि नेटवर्क I / O संचालन किसी बाहरी घटना की उम्मीद में इंतजार कर सकता है जैसे कि अन्य समापन बिंदु डेटा के साथ जवाब देने आदि में फ़ाइल संचालन को नोड से ही कुछ काम करने की आवश्यकता होती है। उदाहरण के लिए, यदि आप एक फ़ाइल खोलते हैं और fd के डेटा के साथ तैयार होने की प्रतीक्षा करते हैं, तो ऐसा नहीं होगा, क्योंकि कोई भी वास्तव में नहीं पढ़ रहा है! उसी समय, यदि आप मुख्य थ्रेड में फ़ाइल इनलाइन से पढ़ते हैं, तो यह संभावित रूप से प्रोग्राम में अन्य गतिविधियों को ब्लॉक कर सकता है, और दृश्यमान समस्याएं पैदा कर सकता है, क्योंकि सीपीयू बाध्य गतिविधियों की तुलना में फ़ाइल संचालन बहुत धीमा है। इसलिए आंतरिक कार्यकर्ता सूत्र (UV_THREADPOOL_SIZE पर्यावरण चर के माध्यम से विन्यास) फाइलों पर काम करने के लिए कार्यरत हैं,

उम्मीद है की यह मदद करेगा।


आप इन बातों को कैसे जानते हैं, क्या आप मुझे स्रोत की ओर इशारा कर सकते हैं?
सूरज जैन

18

कामवासना का परिचय

Node.js परियोजना 2009 में शुरू हुआ एक जावास्क्रिप्ट वातावरण के रूप में ब्राउज़र से decoupled। Google के V8 और मार्क लेहमैन के कामेच्छा का उपयोग करते हुए , नोड.जेएस ने I / O के एक मॉडल को संयुक्त किया - एक ऐसी भाषा के साथ जो प्रोग्रामिंग की शैली के अनुकूल थी; जिस तरह से यह ब्राउज़रों द्वारा आकार दिया गया था। जैसा कि नोड.जेएस लोकप्रियता में वृद्धि हुई है, इसे विंडोज पर काम करना महत्वपूर्ण था, लेकिन लिबाव केवल यूनिक्स पर ही चलता था। Windows कर्नेल इवेंट सूचना तंत्र जैसे kqueue या (e) पोल के समतुल्य IOCP है। libuv मंच के आधार पर libev या IOCP के आसपास एक अमूर्त था, जो उपयोगकर्ताओं को libev के आधार पर एक API प्रदान करता है। Libv libv के नोड- v0.9.0 संस्करण में हटा दिया गया था

इसके अलावा एक तस्वीर जो @ व्यस्त राही द्वारा Node.js में इवेंट लूप का वर्णन करती है


अपडेट 05/09/2017

इस दस्तावेज़ के अनुसार Node.js ईवेंट लूप ,

निम्न आरेख ईवेंट लूप के संचालन के क्रम का एक सरलीकृत अवलोकन दिखाता है।

   ┌───────────────────────┐
┌─>│        timers         
  └──────────┬────────────┘
  ┌──────────┴────────────┐
       I/O callbacks     
  └──────────┬────────────┘
  ┌──────────┴────────────┐
       idle, prepare     
  └──────────┬────────────┘      ┌───────────────┐
  ┌──────────┴────────────┐         incoming:   
           poll          │<─────┤  connections, 
  └──────────┬────────────┘         data, etc.  
  ┌──────────┴────────────┐      └───────────────┘
          check          
  └──────────┬────────────┘
  ┌──────────┴────────────┐
└──┤    close callbacks    
   └───────────────────────┘

नोट: प्रत्येक बॉक्स को इवेंट लूप के "चरण" के रूप में संदर्भित किया जाएगा।

चरणों का अवलोकन

  • टाइमर : इस चरण द्वारा setTimeout()और द्वारा निर्धारित कॉलबैक निष्पादित करता है setInterval()
  • I / O कॉलबैक : करीब कॉलबैक के अपवाद के साथ लगभग सभी कॉलबैक निष्पादित करता है , जिन्हें टाइमर द्वारा निर्धारित किया गया है, और setImmediate()
  • निष्क्रिय, तैयार : केवल आंतरिक रूप से उपयोग किया जाता है।
  • पोल : नए I / O ईवेंट पुनः प्राप्त करें; उपयुक्त होने पर नोड यहां ब्लॉक हो जाएगा।
  • जाँच करें : setImmediate()कॉलबैक यहाँ लागू किए गए हैं।
  • करीबी कॉलबैक : उदाहरण के लिए socket.on('close', ...)

ईवेंट लूप के प्रत्येक रन के बीच, Node.js यह जाँचता है कि क्या यह किसी अतुल्यकालिक I / O या टाइमर की प्रतीक्षा कर रहा है और यदि कोई नहीं है तो सफाई से बंद हो जाता है।


आपने उस " In the node-v0.9.0 version of libuv libev was removed" को उद्धृत किया है , लेकिन नोडज में इसके बारे में कोई विवरण नहीं है changeloggithub.com/nodejs/node/blob/master/CHANGELOG.md । और अगर लिबडे को हटा दिया जाता है, तो अब नोडज में एस्कॉन I / O कैसे हो रहा है?
इंतेखाब

@intekhab, इस लिंक के अनुसार , मुझे लगता है कि libeio पर आधारित लिबवू का उपयोग नोड में ईज लूप के रूप में किया जा सकता है।
ज़ंगव w ’

@intekhab मुझे लगता है कि libuv I / O और मतदान से संबंधित सभी सुविधाओं को लागू कर रहा है। यहाँ इस डॉक्टर में जाँच करें: docs.libuv.org/en/v1.x/loop.html
mohit kaushik

13

NodeJs आर्किटेक्चर में एक इवेंट लूप है।

Node.js इवेंट लूप मॉडल

नोड अनुप्रयोग एकल-थ्रेडेड इवेंट-संचालित मॉडल में चलते हैं। हालांकि, नोड पृष्ठभूमि में एक थ्रेड पूल को लागू करता है ताकि काम किया जा सके।

Node.js एक ईवेंट कतार में काम जोड़ता है और फिर एक ईवेंट लूप चलाने वाला एक एकल थ्रेड होता है। इवेंट लूप इवेंट कतार में शीर्ष आइटम को पकड़ता है, इसे निष्पादित करता है, और फिर अगले आइटम को पकड़ लेता है।

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

इवेंट लूप समस्याओं का सामना करना शुरू कर देता है जब हमारे आवेदन कार्य I / O पर ब्लॉक हो जाते हैं।

I / O को अवरुद्ध करने के लिए प्रतीक्षा करने से बचने के लिए Node.js ईवेंट कॉलबैक का उपयोग करता है। इसलिए, I / O को अवरुद्ध करने वाले किसी भी अनुरोध को पृष्ठभूमि में एक अलग धागे पर किया जाता है।

जब I / O को ब्लॉक करने वाली घटना को इवेंट कतार से पुनर्प्राप्त किया जाता है, तो Node.js थ्रेड पूल से एक थ्रेड पुनर्प्राप्त करता है, और मुख्य ईवेंट लूप थ्रेड के बजाय फ़ंक्शन को निष्पादित करता है। यह शेष I / O को इवेंट क्यू में शेष घटनाओं को रखने से रोकता है।


8

केवल एक ईवेंट लूप है जो लिब्यू द्वारा प्रदान किया गया है, वी 8 सिर्फ एक जेएस रनटाइम इंजन है।


1

एक जावास्क्रिप्ट शुरुआत के रूप में, मैं भी एक ही शक था, NodeJS 2 घटना लूप शामिल है ?. लंबे शोध और V8 योगदानकर्ता में से एक के साथ चर्चा करने के बाद, मुझे निम्नलिखित अवधारणाएं मिलीं।

  • ईवेंट लूप जावास्क्रिप्ट प्रोग्रामिंग मॉडल की एक मौलिक अमूर्त अवधारणा है। तो V8 इंजन ईवेंट लूप के लिए एक डिफ़ॉल्ट कार्यान्वयन प्रदान करता है, जिसे एम्बेड (ब्राउज़र, नोड) प्रतिस्थापित या विस्तारित कर सकता है । आप लोग यहां ईवेंट लूप का V8 डिफ़ॉल्ट कार्यान्वयन पा सकते हैं
  • NodeJS में, केवल एक ईवेंट लूप मौजूद है , जो नोड रनटाइम द्वारा प्रदान किया गया है। V8 डिफ़ॉल्ट इवेंट लूप कार्यान्वयन को NodeJS ईवेंट लूप कार्यान्वयन के साथ बदल दिया गया था

0

pbkdf2समारोह जावास्क्रिप्ट कार्यान्वयन है, लेकिन यह वास्तव में प्रतिनिधियों सब काम सी ++ ओर करने के लिए किया जाना चाहिए।

env->SetMethod(target, "pbkdf2", PBKDF2);
  env->SetMethod(target, "generateKeyPairRSA", GenerateKeyPairRSA);
  env->SetMethod(target, "generateKeyPairDSA", GenerateKeyPairDSA);
  env->SetMethod(target, "generateKeyPairEC", GenerateKeyPairEC);
  NODE_DEFINE_CONSTANT(target, OPENSSL_EC_NAMED_CURVE);
  NODE_DEFINE_CONSTANT(target, OPENSSL_EC_EXPLICIT_CURVE);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS1);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS8);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingSPKI);
  NODE_DEFINE_CONSTANT(target, kKeyEncodingSEC1);
  NODE_DEFINE_CONSTANT(target, kKeyFormatDER);
  NODE_DEFINE_CONSTANT(target, kKeyFormatPEM);
  NODE_DEFINE_CONSTANT(target, kKeyTypeSecret);
  NODE_DEFINE_CONSTANT(target, kKeyTypePublic);
  NODE_DEFINE_CONSTANT(target, kKeyTypePrivate);
  env->SetMethod(target, "randomBytes", RandomBytes);
  env->SetMethodNoSideEffect(target, "timingSafeEqual", TimingSafeEqual);
  env->SetMethodNoSideEffect(target, "getSSLCiphers", GetSSLCiphers);
  env->SetMethodNoSideEffect(target, "getCiphers", GetCiphers);
  env->SetMethodNoSideEffect(target, "getHashes", GetHashes);
  env->SetMethodNoSideEffect(target, "getCurves", GetCurves);
  env->SetMethod(target, "publicEncrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
                                         EVP_PKEY_encrypt_init,
                                         EVP_PKEY_encrypt>);
  env->SetMethod(target, "privateDecrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
                                         EVP_PKEY_decrypt_init,
                                         EVP_PKEY_decrypt>);
  env->SetMethod(target, "privateEncrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
                                         EVP_PKEY_sign_init,
                                         EVP_PKEY_sign>);
  env->SetMethod(target, "publicDecrypt",
                 PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
                                         EVP_PKEY_verify_recover_init,
                                         EVP_PKEY_verify_recover>);

संसाधन: https://github.com/nodejs/node/blob/master/src/node_crypto.cc

लिबुव मॉड्यूल की एक और जिम्मेदारी है जो मानक पुस्तकालय में कुछ विशेष कार्यों के लिए प्रासंगिक है।

कुछ मानक लाइब्रेरी फ़ंक्शन कॉल के लिए, नोड C ++ पक्ष और Libuv पूरी तरह से इवेंट लूप के बाहर महंगी गणना करने का निर्णय लेते हैं।

इसके बजाय वे थ्रेड पूल नामक किसी चीज का उपयोग करते हैं, थ्रेड पूल चार धागों की एक श्रृंखला है जिसका उपयोग pbkdf2फंक्शन जैसे कम्प्यूटेशनल रूप से महंगे कार्यों को चलाने के लिए किया जा सकता है ।

डिफ़ॉल्ट रूप से लिबुव इस थ्रेड पूल में 4 धागे बनाता है।

ईवेंट लूप में उपयोग किए जाने वाले थ्रेड्स के अलावा चार अन्य थ्रेड्स हैं जिनका उपयोग महंगी गणनाओं को ऑफलोड करने के लिए किया जा सकता है जो हमारे एप्लिकेशन के अंदर होने की आवश्यकता होती है।

नोड मानक पुस्तकालय में शामिल कई फ़ंक्शन स्वचालित रूप से इस थ्रेड पूल का उपयोग करते हैं। pbkdf2समारोह उनमें से एक जा रहा है।

इस थ्रेड पूल की उपस्थिति बहुत महत्वपूर्ण है।

तो नोड वास्तव में एकल थ्रेडेड नहीं है, क्योंकि अन्य धागे हैं जो नोड कुछ कम्प्यूटेशनल रूप से महंगे कार्यों को करने के लिए उपयोग करते हैं।

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

हमारा CPU एक-एक करके सभी निर्देशों को थ्रेड के अंदर चलाता है।

थ्रेड पूल का उपयोग करके हम एक ईवेंट लूप के अंदर अन्य चीजें कर सकते हैं जबकि गणनाएं हो रही हैं।

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