节点集群:仅将任务处理给一个工作程序

时间:2015-10-16 18:43:36

标签: node.js multithreading postgresql cluster-computing node-cluster

我正在尝试将群集设置为多线程我的应用程序,但不是每个工作人员委派一个任务,而是将每个任务委派给所有工作人员。

我的代码如下:

//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:password@localhost/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)我得到console.log个正如工人cluster.isMaster设置的那样,我希望只有一个工人会处理每个postgres事件。我怎样才能修复我的代码以实现上述行为?

1 个答案:

答案 0 :(得分:2)

这不需要使用群集。集群均匀分配处理。

您需要完全更改if-else-logic,因为......

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

...明确表示您需要N-Processes。 而不只是child_process.fork();,它将在主线程上明确执行 not 。阅读here