Node.js ہزاروں درخواستوں (requests) کو کیسے سنبھالتا ہے

لوگ کہتے ہیں کہ Node.js single-threaded ہے۔

اس کے باوجود، یہ ہزاروں درخواستوں کو سنبھالتا ہے، فائلیں پڑھتا ہے، اور بغیر رکے API کالز کرتا ہے۔

یہ کیسے کام کرتا ہے؟

اس کا جواب libuv ہے۔

libuv ایک C لائبریری ہے۔ یہ Node.js کو asynchronous اور non-blocking I/O کی صلاحیتیں فراہم کرتی ہے۔ JavaScript اکیلے فائلیں نہیں پڑھ سکتی اور نہ ہی نیٹ ورک ساکٹس (network sockets) کو مینیج کر سکتی ہے۔ Node.js آپ کے آپریٹنگ سسٹم سے بات کرنے کے لیے libuv کا استعمال کرتا ہے۔

libuv کے بغیر، جب بھی آپ کوئی فائل پڑھیں گے، JavaScript رک جائے گی۔ آپ کی ایپ غیر فعال (unresponsive) ہو جائے گی۔

libuv کے ساتھ، فائل بیک گراؤنڈ میں پڑھی جاتی ہے۔ 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 آپ کے کوڈ کو کیسے مینیج کرتا ہے:

Event Loop: libuv وہ لوپ چلاتا ہے جو چیک کرتا ہے کہ کیا ٹاسک مکمل ہو گئے ہیں۔ جب ٹاسک مکمل ہوتے ہیں تو یہ callbacks کو ایک قطار (queue) میں ڈال دیتا ہے۔ • Thread Pool: JavaScript ایک ہی تھریڈ استعمال کرتی ہے۔ libuv ورکر تھریڈز کے پول (pool) کا استعمال کرتا ہے۔ ڈیفالٹ طور پر، اس پول میں 4 تھریڈز ہوتے ہیں۔ یہ تھریڈز بھاری کاموں کو سنبھالتے ہیں جیسے:

  • فائل سسٹم کے آپریشنز (File system operations)
  • DNS lookups
  • کمپریشن (Compression)
  • کرپٹوگرافی (Cryptography) • Networking: libuv، HTTP، TCP، اور UDP ساکٹس کو مینیج کرتا ہے۔ یہ سرورز کو ایک وقت میں بہت سے کنکشنز سنبھالنے کی اجازت دیتا ہے۔ • Timers: libuv، setTimeout اور setInterval کو سنبھالتا ہے۔

ایگزیکیوشن فلو (execution flow) اس طرح کام کرتا ہے:

  1. JavaScript آپ کا کوڈ چلاتی ہے۔
  2. libuv بھاری کاموں کو بیک گراؤنڈ میں لے جاتا ہے۔
  3. JavaScript اگلی لائن پر چلی جاتی ہے۔
  4. جب ٹاسک مکمل ہو جاتا ہے تو libuv Event Loop کو مطلع کرتا ہے۔
  5. Event Loop آپ کا callback چلاتا ہے۔

ایک پیزا شاپ کی مثال لیں۔

libuv کے بغیر، آپ کاؤنٹر پر کھڑے ہو کر ہر دس سیکنڈ بعد پوچھتے ہیں "کیا میرا کھانا تیار ہے؟"۔ آپ لائن کو بلاک کر دیتے ہیں۔

libuv کے ساتھ، آپ آرڈر دیتے ہیں، بیٹھ جاتے ہیں، اور نوٹیفکیشن کا انتظار کرتے ہیں۔ جب تک پیزا تیار نہیں ہو جاتا، آپ دوسرے کام کرنے کے لیے آزاد رہتے ہیں۔

خلاصہ:

• JavaScript ایگزیکیوشن: V8 Engine • Event Loop: libuv • File I/O: libuv • Network: libuv • Timers: libuv

libuv وہ انجن ہے جو Node.js کو تیز رکھتا ہے۔

ماخذ: https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o