Node.js Event Loop ని అర్థం చేసుకోవడం
Event Loop అనేది ఒక వర్కర్ (worker) కాదు. అది ఒక కోఆర్డినేటర్ (coordinator).
చాలా మంది డెవలపర్లు Event Loop ని క్లిష్టంగా భావిస్తారు. ఒకేసారి చాలా కాన్సెప్ట్లను కలపడం వల్ల ఈ ఇబ్బంది వస్తుంది. మీరు libuv, Call Stack, Promises మరియు I/O అన్నింటినీ ఒకే సమయంలో ట్రాక్ చేయాల్సి ఉంటుంది.
ఇక్కడే అసలు విషయం ఉంది. Event Loop పనులను షెడ్యూల్ చేస్తుంది. అది పనిని చేయదు.
JavaScript ఒక సింగిల్ త్రెడ్ (single thread) పై నడుస్తుంది. అంటే కోడ్ ఒక సరళ రేఖలో నడుస్తుంది. ఒక పని పూర్తయిన తర్వాతే తదుపరి పని ప్రారంభమవుతుంది. ప్రోగ్రామ్ మొత్తం ఆగిపోకుండా, ఫైల్స్ చదవడం లేదా నెట్వర్క్ రిక్వెస్ట్ల వంటి అసింక్రోనస్ (asynchronous) పనులను నిర్వహించడానికి మనకు ఒక సిస్టమ్ అవసరం.
ఇది ఎలా పనిచేస్తుంది:
Event Loop వివిధ క్యూల (queues) నుండి కాల్బ్యాక్లను (callbacks) Call Stack లోకి మారుస్తుంది. ప్రతి ఫేజ్ను ఒక లైన్ (line) లాగా ఊహించుకోండి. లైన్లో ఉన్న వ్యక్తులను గదిలోకి పంపే వ్యక్తిలా Event Loop పనిచేస్తుంది.
ప్రధాన ఫేజ్లు ఇవి:
- Timers: setTimeout మరియు setInterval నుండి వచ్చే కాల్బ్యాక్లను హ్యాండిల్ చేస్తుంది.
- Pending Callbacks: TCP ఎర్రర్స్ వంటి నిర్దిష్ట సిస్టమ్ ఎర్రర్లను హ్యాండిల్ చేస్తుంది.
- Idle and Prepare: libuv ద్వారా ఉపయోగించబడే అంతర్గత ఫేజ్లు. వీటిని మీరు ఉపయోగించరు.
- Poll: ఇది అత్యంత ముఖ్యమైన ఫేజ్. ఇది ఫైల్ రీడ్స్ లేదా HTTP రిక్వెస్ట్ల వంటి కొత్త I/O ఈవెంట్లను పొందుతుంది.
- Check: setImmediate కాల్బ్యాక్లను హ్యాండిల్ చేస్తుంది.
- Close Callbacks: సాకెట్ క్లోజర్ల (socket closures) వంటి క్లోజింగ్ ఈవెంట్లను హ్యాండిల్ చేస్తుంది.
Event Loop కి సొంతంగా Call Stack ఉంటుందని అనుకోవడం ఒక సాధారణ తప్పు. దానికి అది ఉండదు. రన్టైమ్ (runtime) కి ఒకే ఒక Call Stack మరియు ఒక microtask queue ఉంటాయి.
ఈ ప్రక్రియ ఈ క్రింది క్రమాన్ని అనుసరిస్తుంది:
- Event Loop ప్రస్తుత ఫేజ్ నుండి ఒక కాల్బ్యాక్ను ఎంచుకుంటుంది.
- అది ఆ కాల్బ్యాక్ను Call Stack లోకి పుష్ చేస్తుంది.
- Call Stack కోడ్ను రన్ చేస్తుంది.
- కాల్బ్యాక్ పూర్తయిన తర్వాత, ఇంజిన్ microtask queue ని క్లియర్ చేస్తుంది. Promises మరియు async/await ఇక్కడే ఉంటాయి.
- Event Loop తదుపరి ఫేజ్కి వెళ్తుంది.
మీరు setTimeout(..., 0) ఉపయోగిస్తే, అది Timers ఫేజ్కి వెళ్తుంది.
మీరు setImmediate(...) ఉపయోగిస్తే, అది Check ఫేజ్కి వెళ్తుంది.
అసలైన పని (heavy lifting) OS kernel మరియు libuv లో జరుగుతుంది. JavaScript ఎప్పుడు స్పందించాలో Event Loop కేవలం చెబుతుంది.
Source: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a