我試圖將集羣設置爲多線程應用程序,但不是爲每個工作人員委派一個任務,而是將每個任務委派給所有工作人員。節點集羣:僅向一名工作人員處理任務
我的代碼去如下:
//main.js
var cluster = require('cluster');
//Code executed by the master process.
if (cluster.isMaster) {
var numWorkers = require('os').cpus().length;
console.log('Setting up ' + numWorkers + ' workers.');
for (var i = 0; i< numWorkers; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
//Spawn a new worker on unexpected events.
cluster.on('exit', function(worker, code, signal) {
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
cluster.fork();
});
} else {
//Set up DB
var pg = require ('pg');
var db = 'tcp://username:[email protected]/dbname';
var pg_client = new pg.Client(db);
pg_client.connect();
//Set up Listener
var query = pg_client.query('LISTEN newevent');
pg_client.on('notification', function(not) {
console.log(not.payload + ' added to queue by ' + process.pid);
})
}
每個工人正在處理else
塊的內容,所以每次我值插入我的表(一個觸發器觸發了,並通知我的pg_client誰在聽)我得到了與工作人員cluster.isMaster
一樣多的console.log
,但是我想只有一個工人會處理每個postgres事件。我如何修復我的代碼以實現上述行爲?
您需要一種鎖定任務的方式,以便第一個獲取它的工作人員以某種方式使其他人早點退出。儘管......這聽起來像是很容易受到種族條件的影響。 –