Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

setImmediate() vs process.nextTick(): Mikro görevleri sıralarken öğrendiğim kritik fark

asteron

Üye
Katılım
14 Mart 2026
Mesajlar
40
Merhaba arkadaşlar, bugün Node.js'in olay döngüsü (event loop) içinde kafamı epey karıştıran, sonra da "Aha!" dedirten bir konudan bahsedeceğim: 🔥 Mikro Görevlerin Sıralaması ve İki Gizemli Fonksiyon

Uzun süre `setImmediate()` ve `process.nextTick()`'in ikisinin de "hemen çalıştır" anlamına geldiğini düşünüyordum. Hatta birbirlerinin yerine kullanabileceğimi sanıyordum. Ta ki, bir I/O işleminden sonra yazdığım callback'lerin beklediğim sırada çalışmadığını fark edene kadar. İşte o zaman kafayı yemiştim ve derinlere daldım.

📚 Temel Fark Nedir?

İkisi de asenkron işlemleri planlamak için kullanılsa da, olay döngüsündeki konumları tamamen farklı. Kısaca:
`process.nextTick()` bir mikro görev kuyruğudur ve olay döngüsünün her fazından önce, hemen çalıştırılır. Yani önceliği çok yüksektir.
`setImmediate()` ise adından da anlaşılacağı gibi, olay döngüsünün "check" fazında çalışan bir timer'dır. `nextTick`'ten sonra gelir.

💻 Kodu Görünce Anlaşılır

Bu farkı anlamanın en iyi yolu bir örnek görmek. Aşağıdaki kodu çalıştıralım:

JavaScript:
console.log('1. Script başladı');

setImmediate(() => {
    console.log('3. setImmediate callback çalıştı');
});

process.nextTick(() => {
    console.log('2. nextTick callback çalıştı');
});

console.log('4. Script bitti');

Bu kodu çalıştırdığınızda çıktı şu şekilde olacak:
1. Script başladı
4. Script bitti
2. nextTick callback çalıştı
3. setImmediate callback çalıştı

Gördüğünüz gibi, script bittikten sonra ilk iş `nextTick` kuyruğu temizleniyor. Ardından olay döngüsünün "check" fazına geçildiğinde `setImmediate` çalışıyor.

🚨 Kritik Senaryo: I/O İşlemleri ve Karmaşa

Asıl sürpriz, bu iki fonksiyonu bir I/O işleminin (örneğin dosya okuma) callback'i içinde kullandığınızda ortaya çıkıyor. Bu durumda sıralama değişebilir!

JavaScript:
const fs = require('fs');

fs.readFile(__filename, () => {
    console.log('I/O Callback içi');

    setImmediate(() => {
        console.log('setImmediate (I/O içinde)');
    });

    process.nextTick(() => {
        console.log('nextTick (I/O içinde)');
    });
});

process.nextTick(() => {
    console.log('nextTick (Global)');
});

setImmediate(() => {
    console.log('setImmediate (Global)');
});

console.log('Script Bitti');

Bu kodun çıktısı genellikle şöyle olur:
Script Bitti
nextTick (Global)
setImmediate (Global)
I/O Callback içi
nextTick (I/O içinde)
setImmediate (I/O içinde)

Buradaki kritik nokta: Bir I/O işleminin callback'i çalıştığında, `nextTick` yine öncelikli olarak hemen o callback'in içinden çalışır. Ancak, global kapsamdaki `setImmediate`, I/O callback'inden önce çalışmış olabilir. Bu, olay döngüsünün hangi fazda olduğuna bağlıdır ve kafa karıştırıcıdır.

⚠️ Hangi Durumda Hangisini Kullanmalı?

process.nextTick(): Bir sonraki olay döngüsü iterasyonuna geçmeden hemen şimdi yapılması gereken, kritik işler için. Örneğin, bir API'yi kullanmadan önce kullanıcı tanımlamasını bitirmek veya bir hata durumunda callback'i ertelenmiş (deferred) şekilde çağırmak. Ancak dikkat! Bu kuyruğu çok doldurmak, I/O işlemlerini açlığa mahkum edebilir (starvation).

setImmediate(): Yine hemen, ancak olay döngüsünün bir sonraki "check" fazında yapılması gereken işler için. Özellikle I/O işlemlerinin callback'leri içinden çağrıldığında daha tahmin edilebilir bir sıralama sağlar. Uzun süren hesaplamaları asenkron hale getirip olay döngüsünü bloke etmemek için idealdir.

Sonuç olarak, `process.nextTick()` bir acil servis, `setImmediate()` ise randevulu sistem gibi düşünebilirsiniz. İkisi de "hemen" der ama biri diğerinden daha "hemen"dir.

Siz Node.js'te asenkron kod yazarken bu iki fonksiyondan hangisini daha sık kullanıyorsunuz? Ya da `Promise.resolve().then()` gibi mikro görevlerle aralarındaki sıralama konusunda bir tecrübeniz var mı? Yorumlarda buluşalım!
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri