Worker Threads ile Paralel Programlama
- 13
- (1)
- (5)
- 26 Oca 2025
Node.js, tek iş parçacıklı bir mimariye sahip olmasına rağmen, paralel işlemler gerçekleştirebilmek için güçlü araçlar sunar. Worker Threads modülü, CPU yoğunluklu işlemleri ana iş parçacığını (event loop) bloklamadan yürütmek için kullanılan bir Node.js özelliğidir. Bu modül, her bir iş parçasını ayrı bir thread olarak çalıştırır ve paralel işlemler gerçekleştirilmesine olanak tanır. Bu makalede, Worker Threads ile paralel programlama kavramlarını ve pratik kullanım örneklerini inceleyeceğiz.
Worker Threads Nedir?
Worker Threads, Node.js 10.5.0 sürümünde tanıtılmıştır ve CPU yoğunluklu görevleri (örneğin, büyük veri hesaplamaları veya kriptografik işlemler) ana iş parçacığını bloklamadan gerçekleştirmek için kullanılır. Her bir iş parçası kendi V8 motor örneğine sahip olduğu için birbirinden bağımsızdır.
Özellikleri:
- Her iş parçası bağımsız bir ortamda çalışır.
- İş parçacıkları arasında iletişim
MessagePort
kullanılarak sağlanır. - Büyük veriler,
Transferable Objects
veyaSharedArrayBuffer
ile paylaşılabilir.
Worker Threads Kullanımı
1. Temel Kullanım
Aşağıda bir iş parçası oluşturarak paralel bir işlem gerçekleştiren bir örnek bulunmaktadır:
worker.js
Dosyası:
const { parentPort } = require('worker_threads');
// Gelen mesajı dinler ve işlem yapar
parentPort.on('message', (data) => {
const sonuc = uzunHesaplama(data);
parentPort.postMessage(sonuc);
});
// CPU yoğunluklu işlem
function uzunHesaplama(sayi) {
let toplam = 0;
for (let i = 0; i < sayi; i++) {
toplam += i;
}
return toplam;
}
main.js
Dosyası:
const { Worker } = require('worker_threads');
const calistirWorker = (sayi) => {
return new Promise((resolve, reject) => {
const worker = new Worker('./worker.js');
worker.postMessage(sayi);
worker.on('message', (sonuc) => {
resolve(sonuc);
});
worker.on('error', (err) => {
reject(err);
});
worker.on('exit', (code) => {
if (code !== 0) {
reject(new Error(`Worker exited with code ${code}`));
}
});
});
};
(async () => {
try {
console.log('İşlem başlatıldı...');
const sonuc = await calistirWorker(1e6);
console.log('Sonuç:', sonuc);
} catch (err) {
console.error('Hata:', err);
}
})();
Çıktı:
İşlem başlatıldı...
Sonuç: 499999500000
2. Birden Fazla İş Parçası Kullanımı
Birden fazla iş parçasını aynı anda çalıştırarak paralel işlemleri hızlandırabilirsiniz:
const { Worker } = require('worker_threads');
const calistirWorker = (sayi) => {
return new Promise((resolve, reject) => {
const worker = new Worker('./worker.js');
worker.postMessage(sayi);
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0) reject(new Error(`Worker exited with code ${code}`));
});
});
};
(async () => {
const isler = [1e6, 1e7, 1e8];
const promises = isler.map((is) => calistirWorker(is));
try {
const sonuclar = await Promise.all(promises);
console.log('Sonuçlar:', sonuclar);
} catch (err) {
console.error('Hata:', err);
}
})();
Çıktı:
Sonuçlar: [499999500000, 49999995000000, 4999999950000000]
SharedArrayBuffer Kullanımı
İş parçacıkları arasında veri paylaşımı yapmak için SharedArrayBuffer
kullanılabilir. Bu, büyük veri setlerini kopyalamadan iş parçacıkları arasında paylaşmayı sağlar:
worker.js
Dosyası:
const { parentPort } = require('worker_threads');
parentPort.on('message', (sharedBuffer) => {
const sharedArray = new Int32Array(sharedBuffer);
for (let i = 0; i < sharedArray.length; i++) {
Atomics.add(sharedArray, i, 1); // Değeri artır
}
parentPort.postMessage('Tamamlandı');
});
main.js
Dosyası:
const { Worker } = require('worker_threads');
const buffer = new SharedArrayBuffer(4 * 10); // 10 adet 32 bitlik tamsayı
const sharedArray = new Int32Array(buffer);
const worker = new Worker('./worker.js');
worker.postMessage(buffer);
worker.on('message', (mesaj) => {
console.log(mesaj);
console.log('Güncellenmiş Array:', sharedArray);
});
Tamamlandı
Güncellenmiş Array: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Worker Threads Ne Zaman Kullanılmalı?
- CPU Yoğunluklu İşlemler: Matematiksel hesaplamalar, kriptografi, sıkıştırma veya büyük veri işlemleri.
- Bağımsız Görevler: Birbirinden bağımsız işlemleri paralel olarak gerçekleştirme.
- Gelişmiş Performans Gereksinimleri: Event loop'u bloklamadan işlemleri hızlandırma.
Worker Threads, Node.js'te paralel programlama yapmanın güçlü bir yolunu sunar. Ana iş parçacığını bloklamadan ağır işlemleri yürütmek için mükemmel bir araçtır. İş parçacıkları arasında veri paylaşımı yapmak ve büyük hesaplamaları paralel olarak gerçekleştirmek için bu modülü kullanabilirsiniz. Projelerinizde performansı artırmak için Worker Threads modülünü deneyebilirsiniz.
İlişkili İçerikler
Async/Await, Node.js uygulamalarında asenkron işlemleri daha okunabilir ve yönetilebilir hale getiren modern bir JavaScript yapısıdır.