Node.js எவ்வாறு ஆயிரக்கணக்கான கோரிக்கைகளைக் கையாள்கிறது

Node.js என்பது single-threaded என்று மக்கள் கூறுகிறார்கள்.

இருப்பினும், இது நிறுத்தப்படாமல் ஆயிரக்கணக்கான கோரிக்கைகளைக் கையாள்கிறது, கோப்புகளைப் படிக்கிறது மற்றும் API அழைப்புகளைச் செய்கிறது.

இது எப்படிச் செயல்படுகிறது?

இதற்கான பதில் libuv ஆகும்.

libuv என்பது ஒரு C library ஆகும். இது Node.js-க்கு asynchronous மற்றும் non-blocking I/O திறன்களை வழங்குகிறது. JavaScript தானாகவே கோப்புகளைப் படிக்கவோ அல்லது network sockets-களை நிர்வகிக்கவோ முடியாது. உங்கள் operating system-உடன் தொடர்புகொள்ள Node.js libuv-ஐப் பயன்படுத்துகிறது.

libuv இல்லையென்றால், நீங்கள் ஒவ்வொரு முறை ஒரு கோப்பைப் படிக்கும் போதும் JavaScript நின்றுவிடும். உங்கள் app பதிலளிக்காத நிலைக்குத் தள்ளப்படும்.

libuv இருந்தால், கோப்புப் படிப்பு பின்னணியில் (background) நடக்கும். JavaScript மற்ற குறியீடுகளைத் தொடர்ந்து இயக்கும்.

உதாரணம்:

console.log("Start");

fs.readFile("data.txt", "utf8", (err, data) => {
  console.log(data);
});

console.log("End");

வெளியீடு: Start End (file contents)

கோப்புப் படிப்பு முடிவதற்கு முன்பே Node.js "End" என்று அச்சிடுகிறது. அது காத்திருப்பதில்லை.

libuv உங்கள் குறியீட்டை எவ்வாறு நிர்வகிக்கிறது:

The Event Loop: பணிகள் முடிந்துவிட்டனவா என்பதைச் சரிபார்க்கும் loop-ஐ libuv இயக்குகிறது. பணிகள் முடிந்ததும், அது callbacks-களை ஒரு queue-வில் சேர்க்கிறது. • Thread Pool: JavaScript ஒரு thread-ஐப் பயன்படுத்துகிறது. libuv worker threads-களின் தொகுப்பைப் (pool) பயன்படுத்துகிறது. இயல்பாகவே, இந்த pool-இல் 4 threads உள்ளன. இந்த threads பின்வரும் கடினமான பணிகளைக் கையாளுகின்றன:

  • File system operations
  • DNS lookups
  • Compression
  • Cryptography • Networking: libuv ஆனது HTTP, TCP மற்றும் UDP sockets-களை நிர்வகிக்கிறது. இது ஒரே நேரத்தில் பல இணைப்புகளைக் கையாள சர்வர்களுக்கு அனுமதிக்கிறது. • Timers: libuv ஆனது setTimeout மற்றும் setInterval-ஐக் கையாள்கிறது.

செயல்பாட்டு முறை (execution flow) இவ்வாறு அமைகிறது:

  1. JavaScript உங்கள் குறியீட்டை இயக்குகிறது.
  2. libuv கடினமான பணிகளைப் பின்னணிக்கு (background) எடுத்துச் செல்கிறது.
  3. JavaScript அடுத்த வரிக்குத் தொடர்கிறது.
  4. பணி முடிந்ததும் libuv, Event Loop-க்குத் தெரிவிக்கிறது.
  5. Event Loop உங்கள் callback-ஐ இயக்குகிறது.

ஒரு பீட்சா கடையைப் பற்றிச் சிந்திப்போம்.

libuv இல்லையென்றால், நீங்கள் கவுண்டரில் நின்று ஒவ்வொரு பத்து வினாடிக்கும் "என் உணவு தயாராகிவிட்டதா?" என்று கேட்பீர்கள். இது வரிசையில் உள்ள மற்றவர்களைத் தடுக்கும் (block).

libuv இருந்தால், நீங்கள் ஆர்டர் செய்துவிட்டு, அமர்ந்து ஒரு அறிவிப்பிற்காக (notification) காத்திருப்பீர்கள். பீட்சா தயாராகும் வரை நீங்கள் மற்ற வேலைகளைச் செய்ய சுதந்திரமாக இருப்பீர்கள்.

சுருக்கம்:

• JavaScript execution: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv

Node.js-ஐ வேகமாக வைத்திருக்க உதவும் இயந்திரம் libuv ஆகும்.

ஆதாரம்: https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o