Node.js, asenkron işlemleri verimli bir şekilde yönetmek için event-driven (olay güdümlü) bir mimari kullanır. Bu mimarinin temel taşlarından biri olan Event Loop, Node.js'nin senkron ve asenkron kodları koordine etmesini sağlar. Bu makalede, Event Loop'un son adımı olan Close Queue ve onun çalışma prensipleri detaylı bir şekilde ele alınacaktır.
Event Loop, Node.js'nin kalbidir ve JavaScript motorunun senkron ve asenkron işlemleri yönetmesini sağlar. Event Loop, altı ana kuyruktan (queue) oluşur:
Next Tick Queue: process.nextTick
ile kuyruklanan callback'ler burada yer alır.
Promise Queue: Promise'lerin resolve veya reject edilmesiyle kuyruklanan callback'ler burada yer alır.
Timer Queue: setTimeout
ve setInterval
ile kuyruklanan callback'ler burada yer alır.
IO Queue: Asenkron IO operasyonları tamamlandığında kuyruklanan callback'ler burada yer alır.
Check Queue: setImmediate
ile kuyruklanan callback'ler burada yer alır.
Close Queue: Close event'leri ile kuyruklanan callback'ler burada yer alır.
Close Queue, bir kaynak (örneğin bir dosya veya ağ bağlantısı) kapandığında tetiklenen callback fonksiyonlarının kuyruklandığı yerdir. Close Queue'nun en önemli özelliklerinden biri, diğer tüm kuyruklar boşaldıktan sonra çalıştırılmasıdır. Bu, kaynakların temizlenmesi ve kapanma işlemlerinin diğer tüm işlemler tamamlandıktan sonra yapılmasını sağlar.
Bir örnekle Close Queue'nun nasıl çalıştığını inceleyelim. Aşağıdaki kod, bir readable stream oluşturur, bu stream'i kapatır ve close
event'ini dinler.
const fs = require("fs");
// Readable stream oluşturuluyor
const readableStream = fs.createReadStream(__filename);
// Stream kapatılıyor
readableStream.close();
// Close event dinleniyor
readableStream.on("close", () => {
console.log("readableStream close event callback");
});
// Diğer asenkron metotlar
setImmediate(() => console.log("setImmediate 1"));
setTimeout(() => console.log("setTimeout 1"), 0);
Promise.resolve().then(() => console.log("Promise.resolve 1"));
process.nextTick(() => console.log("process.nextTick 1"));
Bu kod çalıştırıldığında, aşağıdaki çıktı elde edilir:
process.nextTick callback
Promise.resolve callback
setTimeout callback
setImmediate callback
readable stream close event callback
Bu çıktıya göre, Close Queue'daki callback'ler diğer tüm kuyruklar boşaldıktan sonra çalıştırılır.
Event Loop, her döngüsünde aşağıdaki adımları izler:
Call Stack'in Boşaltılması: İlk olarak, call stack'teki tüm senkron kodlar çalıştırılır.
Next Tick Queue: process.nextTick
ile kuyruklanan callback'ler çalıştırılır.
Promise Queue: Promise'lerin resolve veya reject edilmesiyle kuyruklanan callback'ler çalıştırılır.
Timer Queue: setTimeout
ve setInterval
ile kuyruklanan callback'ler çalıştırılır.
IO Queue: Asenkron IO operasyonları tamamlandığında kuyruklanan callback'ler çalıştırılır.
Check Queue: setImmediate
ile kuyruklanan callback'ler çalıştırılır.
Close Queue: Close event'leri ile kuyruklanan callback'ler çalıştırılır.
Event Loop, Node.js'nin senkron ve asenkron işlemleri koordine etmesini sağlar. Her bir kuyruk, belirli türdeki asenkron işlemler için kullanılır ve bu kuyruklar belirli bir sırayla işlenir. Örneğin, process.nextTick
ve Promise callback'leri her bir kuyruk ve callback yürütme arasında çalıştırılır, bu da onların diğer asenkron işlemlerden önce çalıştırılmasını sağlar.
Node.js Event Loop, senkron ve asenkron kodların verimli bir şekilde çalıştırılmasını sağlayan karmaşık fakat güçlü bir yapıdır. Close Queue, kaynakların kapanma işlemlerinin diğer tüm işlemler tamamlandıktan sonra yapılmasını sağlayarak, kaynak yönetimini daha verimli hale getirir. Bu makalede, Event Loop'un çalışma prensipleri ve Close Queue'nun nasıl çalıştığı detaylı bir şekilde ele alınmıştır. Node.js geliştiricileri için bu bilgilerin anlaşılması, asenkron kodların daha verimli ve etkili bir şekilde yazılmasına yardımcı olacaktır.