توضیح Event Loop در Node.js

Node.js از یک تک‌رشته (single thread) استفاده می‌کند. شاید از خود بپرسید که چگونه می‌تواند هزاران درخواست را به طور همزمان مدیریت کند.

راز آن در Event Loop نهفته است.

Node.js به جای اینکه منتظر تمام شدن یک کار بماند، کارهای زمان‌بر را به سیستم‌عامل می‌سپارد. سپس بلافاصله به سراغ کار بعدی می‌رود. این ویژگی باعث می‌شود برنامه‌های شما سریع و پاسخگو باشند.

مسدودکننده (Blocking) در مقابل غیرمسدودکننده (Non-blocking)

اگر از توابع همگام (sync) مانند readFileSync استفاده کنید، سرور متوقف می‌شود. سرور منتظر می‌ماند تا خواندن فایل تمام شود و در این مدت هیچ کاربر دیگری پاسخی دریافت نمی‌کند. این کار عملکرد (performance) شما را از بین می‌برد.

اما اگر از fs.readFile استفاده کنید، سرور به کار خود ادامه می‌دهد. در حالی که فایل در پس‌زمینه در حال خوانده شدن است، سرور به مدیریت درخواست‌های دیگر می‌پردازد.

نحوه عملکرد Event Loop

این حلقه از چندین مرحله عبور می‌کند:

• Timers: مدیریت setTimeout و setInterval. • Pending Callbacks: مدیریت خطاهای سطح سیستم. • Poll: دریافت اتصالات جدید و مدیریت I/O مانند پرس‌وجوهای پایگاه داده. • Check: مدیریت setImmediate. • Close Callbacks: مدیریت بستن سوکت‌ها.

ترتیب اولویت‌ها

همه کارها با هم برابر نیستند. Node.js از دو صف استفاده می‌کند:

  1. Microtask Queue: این صف شامل Promiseها است.
  2. Callback Queue: این صف شامل setTimeout و I/O است.

Microtask Queue همیشه اول اجرا می‌شود. اگر یک Promise و یک setTimeout داشته باشید، Promise قبل از تایمر به پایان می‌رسد.

Call Stack و صف‌ها

Call Stack ردیابی می‌کند که در حال حاضر کدام کد در حال اجراست. وقتی یک کار تمام می‌شود، callback آن وارد یک صف می‌شود. Event Loop منتظر می‌ماند تا Call Stack خالی شود و سپس کارها را از صف بیرون می‌کشد.

از این اشتباهات دوری کنید:

• از حلقه‌های بی‌نهایت استفاده نکنید؛ این کار کل برنامه شما را منجمد می‌کند. • در محیط عملیاتی (production) از متدهای همگام (synchronous) فایل استفاده نکنید. • محاسبات سنگین ریاضی یا پردازش ویدیو را روی رشته اصلی (main thread) اجرا نکنید.

برای کارهای سنگین، از Worker Threads یا پردازش‌های پس‌زمینه استفاده کنید.

خلاصه

Node.js سریع است چون منتظر نمی‌ماند. این سیستم وظایف I/O را واگذار کرده و از Event Loop برای مدیریت نتایج استفاده می‌کند. این معماری اجازه می‌دهد یک رشته (thread) به کاربران زیادی سرویس‌دهی کند.

کدام بخش از Event Loop برای شما سخت‌تر بود؟ در کامنت‌ها برایم بنویسید.

منبع: https://dev.to/synfinity-dynamics-pvt-ltd/nodejs-event-loop-explained-how-nodejs-handles-thousands-of-concurrent-requests-1heo