Node.js Event Loop'u Anlamak
Event Loop bir işçi değildir. Bir koordinatördür.
Birçok geliştirici Event Loop'u karmaşık bulur. Zorluk genellikle çok fazla kavramın aynı anda birbirine karışmasından kaynaklanır. libuv, Call Stack, Promises ve I/O'yu aynı anda takip etmeniz gerekir.
İşte basit gerçek: Event Loop işleri planlar. İşi kendisi yapmaz.
JavaScript tek bir thread üzerinde çalışır. Bu, kodun düz bir çizgide çalıştığı anlamına gelir. Bir sonraki görev başlamadan önce mevcut görevin bitmesi gerekir. Tüm programı durdurmadan dosya okuma veya ağ istekleri gibi asenkron görevleri yönetecek bir sisteme ihtiyacımız var.
Nasıl çalışır:
Event Loop, farklı kuyruklardaki callback'leri Call Stack'e taşır. Her aşamayı bir kuyruk gibi düşünün. Event Loop, insanları kuyruktan odaya taşıyan kişidir.
Ana aşamalar şunlardır:
- Timers: setTimeout ve setInterval'dan gelen callback'leri yönetir.
- Pending Callbacks: TCP hataları gibi belirli sistem hatalarını yönetir.
- Idle and Prepare: libuv tarafından kullanılan dahili aşamalardır. Bunları kullanmayacaksınız.
- Poll: En önemli aşamadır. Dosya okuma veya HTTP istekleri gibi yeni I/O olaylarını alır.
- Check: setImmediate callback'lerini yönetir.
- Close Callbacks: Socket kapanmaları gibi kapanma olaylarını yönetir.
Yaygın bir hata, Event Loop'un kendine ait bir Call Stack'i olduğunu düşünmektir. Öyle değildir. Runtime'ın tek bir Call Stack'i ve bir microtask kuyruğu vardır.
Süreç şu akışı izler:
- Event Loop, mevcut aşamadan bir callback seçer.
- Bu callback'i Call Stack'e iter.
- Call Stack kodu çalıştırır.
- Callback tamamlandığında, motor microtask kuyruğunu boşaltır. Promises ve async/await burada yer alır.
- Event Loop bir sonraki aşamaya geçer.
Eğer setTimeout(..., 0) kullanırsanız, Timers aşamasına gider. Eğer setImmediate(...) kullanırsanız, Check aşamasına gider.
Ağır iş yükü OS kernel ve libuv tarafında gerçekleşir. Event Loop sadece JavaScript'e ne zaman tepki vermesi gerektiğini söyler.
Kaynak: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a