Worker Threads
Node.js’de Worker Threads, tek iş parçacıklı çalışma modelinin getirdiği sınırlamaları aşmak için kullanılan güçlü bir araçtır. Varsayılan olarak Node.js, tüm JavaScript kodunu tek bir event loop üzerinde çalıştırır; bu nedenle CPU yoğun işlemler ana iş parçacığını bloke ederek uygulamanın performansını düşürebilir. Worker Threads, ayrı iş parçacıkları oluşturarak ağır hesaplamaları veya veri işleme görevlerini paralel olarak yürütmeye olanak tanır ve böylece çok çekirdekli CPU’lardan etkin bir şekilde yararlanılabilir.
Worker Threads, özellikle karmaşık matematiksel hesaplamalar, büyük veri setlerinin işlenmesi, şifreleme, gerçek zamanlı veri analizi ve CPU ağırlıklı görevler için kullanılır. Bu iş parçacıkları birbirinden izole çalışır ve veri paylaşımı için MessagePort
, MessageChannel
veya SharedArrayBuffer
gibi araçlarla iletişim kurar.
Bu rehber, geliştiricilere Worker Threads oluşturmayı, yönetmeyi ve veri alışverişini etkin bir şekilde yapmayı öğretecektir. Ayrıca OOP prensiplerini ve algoritma optimizasyonlarını Worker Threads içinde uygulamayı gösterecektir. Worker Threads kullanmayı öğrenmek, Node.js uygulamalarını daha ölçeklenebilir, verimli ve yüksek performanslı hâle getirmek için kritik bir adımdır.
Temel Örnek
text// Temel Worker Threads örneği
// Dosya: main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
console.log('Ana iş parçacığı: Worker oluşturuluyor...');
const worker = new Worker(__filename);
worker.on('message', msg => console.log('Worker’dan gelen mesaj:', msg));
worker.postMessage('Merhaba Worker!');
} else {
parentPort.on('message', msg => {
console.log('Worker mesajı aldı:', msg);
parentPort.postMessage('Worker’dan selam!');
});
}
Bu örnek, ana iş parçacığı ile Worker arasındaki temel iletişimi gösterir. isMainThread
ile kodun ana iş parçacığında mı yoksa Worker’da mı çalıştığı kontrol edilir. Ana iş parçacığı, aynı dosyayı çalıştıran bir Worker oluşturur ve postMessage
ile mesaj gönderir. Worker, parentPort.on('message')
ile mesajı alır ve yanıtını ana iş parçacığına gönderir.
Worker’lar kendi hafıza ve event loop’larına sahip olduklarından ana iş parçacığındaki değişkenlere doğrudan erişemezler. Bu izolasyon, veri güvenliği sağlar ve senkronizasyon hatalarını önler. Bu yapı, birden fazla Worker’ın bağımsız görevleri paralel olarak yürüttüğü karmaşık uygulamalarda temel bir mimari olarak kullanılır.
Pratik Örnek
text// CPU yoğun işlemler için gelişmiş Worker Threads örneği
// Dosya: compute.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
function runWorker(data) {
return new Promise((resolve, reject) => {
const worker = new Worker(__filename, { workerData: data });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => {
if (code !== 0) reject(new Error(`Worker, ${code} koduyla sonlandı`));
});
});
}
async function main() {
console.time('hesaplama');
const results = await Promise.all([
runWorker(20_000_000),
runWorker(25_000_000)
]);
console.timeEnd('hesaplama');
console.log('Sonuçlar:', results);
}
main();
} else {
const limit = workerData;
let count = 0;
for (let i = 0; i < limit; i++) count += Math.sqrt(i);
parentPort.postMessage(count);
}
Bu pratik örnek, CPU yoğun görevleri paralel olarak Worker Threads ile nasıl çalıştıracağımızı gösterir. runWorker
fonksiyonu, her veri seti için bir Worker oluşturur ve Worker tamamlandığında sonucu döndürür. Worker içinde yoğun bir döngü ile hesaplama yapılır ve sonuç postMessage
ile ana iş parçacığına gönderilir.
Ana iş parçacığı, Promise.all
kullanarak birden fazla Worker’ı aynı anda yönetir ve toplam hesaplama süresini ölçer. Bu yaklaşım, görüntü işleme, matematiksel simülasyonlar veya gerçek zamanlı veri analizi gibi CPU ağırlıklı uygulamalarda idealdir. İş parçacığı yönetiminde hata yakalama, kaynak yönetimi ve iş bölümü optimizasyonu performans açısından kritik öneme sahiptir.
Node.js’de Worker Threads kullanırken dikkat edilmesi gereken en iyi uygulamalar ve yaygın hatalar:
- Veri izolasyonu: Büyük objeleri
postMessage
ile göndermeyin; gerekiyorsaSharedArrayBuffer
kullanın. - Hata yönetimi:
error
veexit
olaylarını dinleyerek Worker’ın beklenmedik kapanmasını önleyin. - Kaynak kontrolü: Aynı anda çok fazla Worker oluşturmayın; Worker havuzu kullanın.
- Debugging:
--inspect
veworker.threadId
ile Worker’ları izleyin. - Güvenlik: Güvenilmeyen kodu Worker içinde çalıştırmayın; girişleri doğrulayın.
Optimizasyon:
- Görevleri dengeli parçalara bölün.
- Görev kuyruğu ile yük dağıtımı yapın.
- Worker’lar arası mesaj trafiğini minimize edin.
📊 Referans Tablosu
Node.js Element/Concept | Description | Usage Example |
---|---|---|
Worker | Yeni bir Worker oluşturur | const worker = new Worker('./task.js'); |
isMainThread | Ana iş parçacığında mı kontrol eder | if (isMainThread) {...} |
parentPort | Worker ile ana iş parçacığı arasında iletişim | parentPort.postMessage('tamam'); |
workerData | Worker’a başlangıç verisi gönderir | new Worker(__filename, { workerData: 42 }); |
MessageChannel | Worker’lar arası iletişim kanalı | const { port1, port2 } = new MessageChannel(); |
SharedArrayBuffer | Worker’lar arasında paylaşılan bellek | new SharedArrayBuffer(1024); |
Worker Threads öğrenmenin temel kazançları, Node.js uygulamalarını yüksek performanslı ve ölçeklenebilir hâle getirmektir. İş parçacığı izolasyonu, veri paylaşımı ve paralel görev yürütme konuları üzerinde ustalaşmak, CPU yoğun görevlerin verimli yönetimini sağlar. Öğrenilen kavramlar, Node.js’in diğer modülleri ve paralel işleme stratejileri ile birleştiğinde güçlü ve güvenli uygulamalar geliştirmeyi mümkün kılar.
İleri adım olarak, cluster
ve child_process
modüllerini ve dağıtık sistemlerde paralel işlem yöntemlerini incelemek önerilir. Bu bilgiler, Node.js projelerinde Worker Threads’i gerçek dünya senaryolarında verimli bir şekilde kullanmak için gereklidir.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek