NodeJS ile çoklu çekirdek kullanımı
Merhaba arkadaşlar. 32 çekirdekli Xenon işlemcili bir sunucu üzerinde nodejs ile proje hazırladım ve tek dosya olarak sorunsuz çalışıyor. Dosyamı pm2 start dosyadi.js şeklinde çalıştırıyorum. Amacım aynı anda birden fazla dosyayı çalıştırabilmek. Konuyu tam olarak anlatmam gerekirse;
pm2 start dosyaadi-1.js
pm2 start dosyaadi-2.js
pm2 start dosyaadi-3.js
şeklinde birbirinin aynı fakat farklı portlara sahip dosyaları çalıştırıyorum.
dışarıdan bu dosyalara işlem gönderdiğim zaman birinde işlem tamamlanmadan, diğerine geçmiyor. Yani benim birim zamanda yaptığım işlem sayısı yine aynı kalıyor. İşlemci ve Ram kullanımları yüksek değil, yani tavan değerlere çıkmıyor. Yaptığım bir işlem ortalama 40sn sürdüğü için ben 40 sn'de 3 veya daha fazla işlem yapmak istiyorum. Bunu nasıl gerçekleştirebilirim? Yardımlarınız için şimdiden teşekkürler.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
Cevaplar için teşekkürler. Tüm aramalar sonucunda hatanın nodejs, pm2 vs olmadığı tamamen tarayıcıdan kaynaklı olduğu görüldü.
Bir tarayıcının aynı siteye önceki istek bitmeden başka istek atmamasından kaynaklı imiş sorun.
Eğer worker işe yaramazsa Node.js'te bir çoklu çekirdeklerle çalışma işlemini aynı anda yürütmek için daha farklı yöntemler de mevcuttur. Örneğin:
- child_process modülünü kullanarak çoklu çekirdeklerle çalıştırmak: Node.js'in child_process modülü, bir node.js işlemini başka bir işlem olarak çalıştırmanıza olanak verir. Bu, aynı anda birden fazla işlemi çalıştırmak için kullanılabilecek bir yöntemdir. Örneğin:
const { fork } = require('child_process');
const worker1 = fork('./worker1.js');
const worker2 = fork('./worker2.js');
- micro kütüphanesini kullanarak çoklu çekirdeklerle çalıştırmak: micro kütüphanesi, node.js'i kullanarak microservisler oluşturmak için kullanılabilecek bir araçtır. micro ile birden fazla dosyayı aynı anda çalıştırabilir ve bunları bir çoklu çekirdeklerle çalıştırma işlemi olarak yapabilirsiniz. Örneğin:
const { micro } = require('micro');
const worker1 = micro('./worker1.js');
const worker2 = micro('./worker2.js');
module.exports = worker1;
module.exports = worker2;
Bu örnekte, worker1.js ve worker2.js dosyalarında çalışan iki çalışma işlemini aynı anda çalıştırmış olursunuz. micro kütüphanesi, node.js uygulamalarını çoklu çekirdeklerle çalıştırmak için kullanılabilecek bir araçtır.
micro kütüphanesi, node.js'in http isteklerini işlemeyi amaçlar ve bu nedenle, çalışma işlemlerinizi bir http sunucusu olarak çalıştırabilirsiniz. Bu, express gibi bir kütüphane kullanarak uygulamanızı yapılandırabilmenizi ve istekleri işlemenizi sağlar. Örneğin:
const { micro, router, send } = require('micro');
const app = router();
app.get('/worker1', async (req, res) => {
// worker1 işlemini çalıştır
const result = await runWorker1();
send(res, 200, result);
});
app.get('/worker2', async (req, res) => {
// worker2 işlemini çalıştır
const result = await runWorker2();
send(res, 200, result);
});
module.exports = app;
Bu örnekte, /worker1 ve /worker2 adreslerine gönderilen isteklerde, worker1 ve worker2 işlemleri çalıştırılır ve sonuçları bir http cevabı olarak gönderilir. Bu şekilde, micro kütüphanesini kullanarak birden fazla çalışma işlemini aynı anda yürütebilirsiniz.
Dikkat: micro kütüphanesi, node.js'in --experimental-module bileşeni ile birlikte kullanılır. Bu bileşen, node.js'in ECMAScript Modülleri (ESM) desteğini sağlar.
child_process modülü hakkında daha fazla bilgi için aşağıdaki kaynakları inceleyebilirsiniz:
Node.js Dökümantasyonu: https://nodejs.org/api/child_process.html
child_process modülünün GitHub sayfası: https://github.com/nodejs/node/blob/main/lib/child_process.js
micro kütüphanesi hakkında daha fazla bilgi için aşağıdaki kaynakları inceleyebilirsiniz:
micro kütüphanesi Dökümantasyonu: https://github.com/zeit/micro#api
@kargasa1982 rica ederim...
Dinamik bilgileri çalışma işlemine göndermek için, Worker sınıfının postMessage() yöntemini kullanabilirsiniz. Bu yöntem, bir çalışma işlemine veri göndermenize olanak verir.
Örneğin:
const { Worker } = require('worker_threads');
const worker = new Worker('./myWorker.js');
// Dinamik bilgileri gönder
worker.postMessage({ data: 'dinamik veri' });
Bu örnekte, myWorker.js dosyasında çalışan çalışma işlemine data: 'dinamik veri' değerini gönderir. Çalışma işleminde bu değeri almak için, onmessage olayı işleyicisini kullanabilirsiniz:
// myWorker.js dosyası
process.on('message', (message) => {
console.log(message); // { data: 'dinamik veri' }
});
Bu şekilde, worker_threads modülünü kullanarak dinamik bilgileri bir çalışma işlemine gönderebilirsiniz.
Not: worker_threads modülü, node.js'in --experimental-worker bileşeni ile birlikte kullanılır. Bu bileşen, node.js'in çalışma işlemlerini desteklemesine olanak verir.
@h4ckdr0 cevabınız için teşekkürler. Benim js dosyalarımda express kullanıyorum ve dosyada işlenmesi gereken değerler dinamik şekilde geliyor dışarıdan. Bu durumda worker'a bu dinamik bilgileri nasıl gönderebilirim?
Merhaba @kargasa1982,
Node.js'in çoklu iş parçacıklı yapısı sayesinde, aynı anda birden fazla işlemi yapabilirsiniz. Ancak bu işlemlerin çalışması için iş parçacıklarının (thread) oluşturulması gerekir. Node.js'in çoklu iş parçacıklı yapısını kullanarak birden fazla işlemi aynı anda gerçekleştirebilmeniz için aşağıdaki adımları izleyebilirsiniz:
1- worker_threads modülünü kullanarak iş parçacıkları oluşturun. worker_threads modülü, Node.js'in iş parçacıklı çalışma modunu sağlar.
const { Worker, isMainThread } = require('worker_threads');
2- Bir iş parçacığı oluşturun ve iş parçacığının çalıştırılacağı kodu belirtin. Örneğin, aşağıdaki kod bloğu bir iş parçacığı oluşturur ve iş parçacığının çalıştırılacağı kodu belirtir:
if (isMainThread) {
const worker = new Worker('./my-worker.js');
}
3- İş parçacıklarının çalışmasını başlatın. Örneğin, aşağıdaki kod bloğu bir iş parçacığını çalıştırır:
if (isMainThread) {
const worker = new Worker('./my-worker.js');
worker.postMessage('start');
}
4- İş parçacıklarının çalışmasını durdurun. Örneğin, aşağıdaki kod bloğu bir iş parçacığını durdurur:
if (isMainThread) {
const worker = new Worker('./my-worker.js');
worker.postMessage('stop');
}
Bu adımları izleyerek, iş parçacıklarını kullanarak birden fazla işlemi aynı anda gerçekleştirebilirsiniz. Bu sayede işlemleriniz daha hızlı tamamlanır ve işlemci ve RAM kullanımınızı azaltabilirsiniz.
Ek olarak, worker_threads modülü hakkında daha fazla bilgi edinmek isterseniz aşağıdaki kaynaklara bakabilirsiniz:
- Node.js belgeleri: https://nodejs.org/api/worker_threads.html
- worker_threads modülü hakkında daha detaylı bilgi: https://nodejs.org/api/worker_threads.html#worker_threads_worker_threads
Ayrıca, iş parçacıklarını kullanarak birden fazla işlemi aynı anda gerçekleştirirken dikkat etmeniz gereken bazı noktalar da olabilir:
- İş parçacıklarının sayısını doğru ayarlamalısınız. Çok fazla iş parçacığı oluşturursanız, iş parçacıkları arasında veri paylaşımı gerekecek ve bu veri paylaşımı işlemleri yavaşlatabilir.
- İş parçacıkları arasında veri paylaşımı yaparken, veri paylaşımı işleminin yapıldığı anda diğer iş parçacıklarının çalışmasını durdurmayı düşünebilirsiniz. Bu sayede iş parçacıkları arasında veri paylaşımı işlemi tamamlandıktan sonra diğer iş parçacıkları tekrar çalışmaya başlar ve işlemler hızı arttırılır.
Umarım bu bilgiler yardımcı olmuştur.