Node.js Event Loop-ஐப் புரிந்துகொள்ளுதல்
Event Loop என்பது ஒரு வேலையாள் அல்ல. அது ஒரு ஒருங்கிணைப்பாளர்.
பல டெவலப்பர்களுக்கு Event Loop சிக்கலானதாகத் தோன்றுகிறது. ஒரே நேரத்தில் பல கருத்துக்களைக் கலந்து பார்ப்பதாலேயே இந்தச் சிரமம் ஏற்படுகிறது. நீங்கள் libuv, Call Stack, Promises மற்றும் I/O ஆகிய அனைத்தையும் ஒரே நேரத்தில் கவனிக்க வேண்டியுள்ளது.
இதோ ஒரு எளிய உண்மை. Event Loop வேலையைத் திட்டமிடுகிறது (schedules). அது வேலையைச் செய்வதில்லை.
JavaScript ஒரு ஒற்றைத் த்ரெட்டில் (single thread) இயங்குகிறது. இதன் பொருள் குறியீடு (code) ஒரு நேர்க்கோட்டில் இயங்கும் என்பதாகும். அடுத்த பணி தொடங்குவதற்கு முன் முந்தைய பணி முடிவடைய வேண்டும். முழு நிரலையும் (program) நிறுத்தாமல், கோப்புகளைப் படித்தல் அல்லது நெட்வொர்க் கோரிக்கைகள் போன்ற asynchronous பணிகளை நிர்வகிக்க நமக்கு ஒரு அமைப்பு தேவைப்படுகிறது.
இது எவ்வாறு செயல்படுகிறது:
Event Loop பல்வேறு வரிசைகளில் (queues) உள்ள callbacks-களை Call Stack-க்குள் நகர்த்துகிறது. ஒவ்வொரு கட்டத்தையும் (phase) ஒரு வரிசையாகக் கருதவும். வரிசையில் இருப்பவர்களை அறைக்குள் அழைத்துச் செல்லும் நபரே Event Loop.
முக்கிய கட்டங்கள் (phases) பின்வருமாறு:
- Timers: setTimeout மற்றும் setInterval ஆகியவற்றிலிருந்து வரும் callbacks-களைக் கையாள்கிறது.
- Pending Callbacks: TCP பிழைகள் போன்ற குறிப்பிட்ட சிஸ்டம் பிழைகளைக் கையாள்கிறது.
- Idle and Prepare: libuv மூலம் பயன்படுத்தப்படும் உட்புறக் கட்டங்கள். இவற்றை நீங்கள் பயன்படுத்த மாட்டீர்கள்.
- Poll: மிக முக்கியமான கட்டம். இது கோப்பு வாசிப்பு அல்லது HTTP கோரிக்கைகள் போன்ற புதிய I/O நிகழ்வுகளைப் பெறுகிறது.
- Check: setImmediate callbacks-களைக் கையாள்கிறது.
- Close Callbacks: socket மூடல் போன்ற மூடும் நிகழ்வுகளைக் கையாள்கிறது.
Event Loop-க்கு என்று தனியாக ஒரு Call Stack இருப்பதாக நினைப்பது ஒரு பொதுவான தவறு. அது இல்லை. Runtime-க்கு ஒரே ஒரு Call Stack மற்றும் ஒரு microtask queue மட்டுமே உள்ளன.
இந்தச் செயல்முறை இந்த வரிசையைப் பின்பற்றுகிறது:
- Event Loop தற்போதைய கட்டத்திலிருந்து ஒரு callback-ஐத் தேர்ந்தெடுக்கிறது.
- அது அந்த callback-ஐ Call Stack-க்குள் தள்ளுகிறது.
- Call Stack குறியீட்டை இயக்குகிறது.
- Callback முடிந்ததும், engine microtask queue-வில் உள்ளவற்றைச் செய்து முடிக்கிறது. Promises மற்றும் async/await ஆகியவை இங்குதான் இயங்குகின்றன.
- Event Loop அடுத்த கட்டத்திற்குச் செல்கிறது.
நீங்கள் setTimeout(..., 0) பயன்படுத்தினால், அது Timers கட்டத்திற்குச் செல்லும். நீங்கள் setImmediate(...) பயன்படுத்தினால், அது Check கட்டத்திற்குச் செல்லும்.
கடினமான வேலைகள் OS kernel மற்றும் libuv ஆகியவற்றில் நடக்கின்றன. JavaScript எப்போது செயல்பட வேண்டும் என்பதை Event Loop மட்டுமே தெரிவிக்கிறது.
ஆதாரம்: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a