ایونت لوپ همان چیزی است که asynchronous programming را در جاواسکریپت ممکن میکند.
مراحل اجرای یک نرم افزارِ node را در نظر بگیریم… به این صورت است:
(فرض کنیم یک app ِ بسیار ساده با تنها یک thread (و یک event loop) داریم. به طور معمول بیش از یک thread -و نتیجتا بیش از یک event loop- خواهیم داشت)
به هر iteration از event loop یک tick می گوییم که از 5 فاز(در واقع بیش از 5 فاز است) تشکیل شده:
گفتیم ابتدا قسمت های synchronous برنامه اجرا میشود و سپس(زمانی که stack از همه ی این قسمت های sync خالی شد) event loop اجرا میشود.
کارِ event loop (این 5 فاز) به طور ساده این است که هرگاه stack خالی بود اولین تسک از task queue را به stack بدهد.
برای درست کار کردن با event loop باید بدانیم که موارد زیر(عناصر async مان) کجای آن اند:
setTimeout ( callback, expTime ) setInterval ( callback, expTime ) setImmediate ( callback) process.nextTick( callback) promise // some promise instance
خروجی به این صورت خواهد بود:
START the code ENDs, now EVENT_LOOP starts... promise 1 next tick 1 setImmediate 1 next tick 2 setTimeout 1 next tick 3 promise 2 setImmediate 2 setTimeout 3
یک جمله که خیلی شنیده میشود این است که "don't block the event loop". این مستقیماً به پرفورمنس برمیگردد. مثلا برای اینکه event loop برای انجام یک عملیات زمان بر، هندل کردن request ها - که در Polling phase انجام میشود - را معتل نکند(میدانیم ایونت لوپ سینگل ترد است) میتوانیم آن عملیات را توسط setImmediate که در Check phase و بعد از Polling اجرا شود، اجرا کنیم. اینگونه در هر tick اول request ها هندل شده و بعد آنکاره زمانبر انجام میشود..
روی هم رفته باید بدانیم چطور تسک ها را queue کنیم که پرفورمنس بهتری بگیریم!
چند رفرنس خوب در این باره:
Does Node.js have more than 1 event loop / task queue? - Quora