Node.js Event Loop বোঝা
Event Loop কোনো কর্মী (worker) নয়। এটি একটি সমন্বয়কারী (coordinator)।
অনেক ডেভেলপারই Event Loop-কে জটিল মনে করেন। এই জটিলতা প্রায়ই আসে একসাথে অনেকগুলো কনসেপ্ট মিলিয়ে ফেলার কারণে। আপনাকে একই সাথে libuv, Call Stack, Promises এবং I/O ট্র্যাক করতে হয়।
আসল সত্যটি হলো এটি। Event Loop কাজগুলো শিডিউল (schedule) করে। এটি নিজে কাজ করে না।
JavaScript একটি সিঙ্গেল থ্রেডে (single thread) চলে। এর মানে হলো কোড একটি সোজা লাইনে চলে। একটি কাজ শেষ না হওয়া পর্যন্ত পরবর্তী কাজ শুরু হতে পারে না। পুরো প্রোগ্রামটি থামিয়ে না দিয়ে ফাইল রিড করা বা নেটওয়ার্ক রিকোয়েস্টের মতো asynchronous কাজগুলো পরিচালনা করার জন্য আমাদের একটি সিস্টেম প্রয়োজন।
এটি যেভাবে কাজ করে:
Event Loop বিভিন্ন কিউ (queue) থেকে callback-গুলোকে Call Stack-এ নিয়ে আসে। প্রতিটি ফেজকে (phase) একটি লাইনের মতো চিন্তা করুন। Event Loop হলো সেই ব্যক্তি যে লাইন থেকে মানুষকে একটি রুমে নিয়ে যাচ্ছে।
প্রধান ফেজগুলো হলো:
- Timers: setTimeout এবং setInterval থেকে আসা callback-গুলো হ্যান্ডেল করে।
- Pending Callbacks: TCP এর মতো নির্দিষ্ট সিস্টেম এররগুলো হ্যান্ডেল করে।
- Idle and Prepare: libuv দ্বারা ব্যবহৃত অভ্যন্তরীণ ফেজ। আপনি এগুলো ব্যবহার করবেন না।
- Poll: সবচেয়ে গুরুত্বপূর্ণ ফেজ। এটি ফাইল রিড বা HTTP রিকোয়েস্টের মতো নতুন I/O ইভেন্টগুলো সংগ্রহ করে।
- Check: setImmediate callback-গুলো হ্যান্ডেল করে।
- Close Callbacks: socket ক্লোজ হওয়ার মতো ক্লোজিং ইভেন্টগুলো হ্যান্ডেল করে।
একটি সাধারণ ভুল হলো মনে করা যে Event Loop-এর নিজস্ব Call Stack আছে। আসলে তা নেই। রানটাইমের একটি মাত্র Call Stack এবং একটি microtask queue থাকে।
প্রক্রিয়াটি এই প্রবাহ অনুসরণ করে:
- Event Loop বর্তমান ফেজ থেকে একটি callback বেছে নেয়।
- এটি সেই callback-টিকে Call Stack-এ পুশ (push) করে।
- Call Stack কোডটি রান করে।
- একবার callback শেষ হয়ে গেলে, ইঞ্জিন microtask queue খালি করে। এখানেই Promises এবং async/await কাজ করে।
- Event Loop পরবর্তী ফেজে চলে যায়।
আপনি যদি setTimeout(..., 0) ব্যবহার করেন, তবে এটি Timers ফেজে যাবে। আপনি যদি setImmediate(...) ব্যবহার করেন, তবে এটি Check ফেজে যাবে।
ভারী কাজগুলো (heavy lifting) OS kernel এবং libuv-তে সম্পন্ন হয়। Event Loop শুধু JavaScript-কে জানায় কখন প্রতিক্রিয়া দেখানোর সময় হয়েছে।
উৎস: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a