avatar
·3 dk okuma
Node.js'de Close Queue

Node.js'de Close Queue

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 Nedir?

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:

  1. Next Tick Queue: process.nextTick ile kuyruklanan callback'ler burada yer alır.

  2. Promise Queue: Promise'lerin resolve veya reject edilmesiyle kuyruklanan callback'ler burada yer alır.

  3. Timer Queue: setTimeout ve setInterval ile kuyruklanan callback'ler burada yer alır.

  4. IO Queue: Asenkron IO operasyonları tamamlandığında kuyruklanan callback'ler burada yer alır.

  5. Check Queue: setImmediate ile kuyruklanan callback'ler burada yer alır.

  6. Close Queue: Close event'leri ile kuyruklanan callback'ler burada yer alır.

Close Queue

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.

Close Queue'nun Kullanımı

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:

  1. process.nextTick callback

  2. Promise.resolve callback

  3. setTimeout callback

  4. setImmediate callback

  5. 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.

close queue gif

Event Loop ve Kuyrukların Yürütülme Sırası

Event Loop, her döngüsünde aşağıdaki adımları izler:

  1. Call Stack'in Boşaltılması: İlk olarak, call stack'teki tüm senkron kodlar çalıştırılır.

  2. Next Tick Queue: process.nextTick ile kuyruklanan callback'ler çalıştırılır.

  3. Promise Queue: Promise'lerin resolve veya reject edilmesiyle kuyruklanan callback'ler çalıştırılır.

  4. Timer Queue: setTimeout ve setInterval ile kuyruklanan callback'ler çalıştırılır.

  5. IO Queue: Asenkron IO operasyonları tamamlandığında kuyruklanan callback'ler çalıştırılır.

  6. Check Queue: setImmediate ile kuyruklanan callback'ler çalıştırılır.

  7. Close Queue: Close event'leri ile kuyruklanan callback'ler çalıştırılır.

Event Loop'un Çalışma Mantığı

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.

Sonuç

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.