2

我試圖將集羣設置爲多線程應用程序,但不是爲每個工作人員委派一個任務,而是將每個任務委派給所有工作人員。節點集羣:僅向一名工作人員處理任務

我的代碼去如下:

//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事件。我如何修復我的代碼以實現上述行爲?

+0

您需要一種鎖定任務的方式,以便第一個獲取它的工作人員以某種方式使其他人早點退出。儘管......這聽起來像是很容易受到種族條件的影響。 –

回答

1

這樣就不需要使用集羣。羣集均勻分配處理。

您需要更改的if-else邏輯則完全是因爲......

for (var i = 0; i< numWorkers; i++) { 
    cluster.fork(); 
} 

...表達明確指出你想要的N-過程。 而不僅僅是child_process.fork();它將在主線程上明確執行而不是。請閱讀它here

+0

你說得對,這不是cluster的正確用例''child_process.fork();'看起來好像是一個更好的選擇,謝謝! – Yonson

相關問題