درک Event Loop در Node.js
Event Loop یک کارگر نیست، بلکه یک هماهنگکننده است.
بسیاری از توسعهدهندگان، Event Loop را پیچیده میدانند. دشواری کار اغلب از ترکیب بیش از حد مفاهیم در یک زمان ناشی میشود. شما باید libuv، Call Stack، Promises و I/O را همزمان دنبال کنید.
حقیقت ساده این است: Event Loop کارها را زمانبندی میکند، اما خودش کار را انجام نمیدهد.
جاوااسکریپت روی یک تکرشته (single thread) اجرا میشود. این یعنی کد در یک خط مستقیم اجرا میشود. یک وظیفه (task) باید قبل از شروع وظیفه بعدی تمام شود. ما به سیستمی نیاز داریم تا وظایف ناهمگام (asynchronous) مانند خواندن فایلها یا درخواستهای شبکه را بدون متوقف کردن کل برنامه مدیریت کند.
نحوه عملکرد:
Event Loop کالبکها (callbacks) را از صفهای مختلف به Call Stack منتقل میکند. هر مرحله را مانند یک صف تصور کنید. Event Loop شخصی است که افراد را از صف به داخل اتاق هدایت میکند.
مراحل اصلی عبارتند از:
- Timers: کالبکهای
setTimeoutوsetIntervalرا مدیریت میکند. - Pending Callbacks: خطاهای خاص سیستم مانند خطاهای TCP را مدیریت میکند.
- Idle and Prepare: مراحل داخلی که توسط libuv استفاده میشوند. شما از اینها استفاده نخواهید کرد.
- Poll: مهمترین مرحله است. این مرحله رویدادهای I/O جدید مانند خواندن فایل یا درخواستهای HTTP را دریافت میکند.
- Check: کالبکهای
setImmediateرا مدیریت میکند. - Close Callbacks: رویدادهای بستن مانند بستن سوکتها را مدیریت میکند.
یک اشتباه رایج این است که تصور شود Event Loop Call Stack مخصوص به خود را دارد. اینطور نیست. محیط اجرا (runtime) تنها یک Call Stack و یک microtask queue دارد.
فرآیند از این جریان پیروی میکند:
- Event Loop یک کالبک را از مرحله فعلی انتخاب میکند.
- آن کالبک را به Call Stack میفرستد (push میکند).
- Call Stack کد را اجرا میکند.
- پس از اتمام کالبک، موتور (engine) صف microtask را تخلیه میکند. اینجاست که Promises و async/await قرار دارند.
- Event Loop به مرحله بعدی میرود.
اگر از setTimeout(..., 0) استفاده کنید، به مرحله Timers میرود.
اگر از setImmediate(...) استفاده کنید، به مرحله Check میرود.
کارهای سنگین در هسته سیستمعامل (OS kernel) و libuv انجام میشود. Event Loop صرفاً به جاوااسکریپت میگوید چه زمانی وقت واکنش نشان دادن است.
منبع: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a