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

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

我的代码如下所示:

//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谁在监听),我得到与工作者cluster.isMaster一样多的console.log 。希望只有一个工人会处理每个postgres事件。 我怎样才能修复我的代码来实现上述行为?

这样就不需要使用集群。 集群平均分配处理。

你需要改变if-else-logic,完全是因为…

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

…明确表示你想要N-Processes。 child_process.fork();只是child_process.fork(); 这将显式执行不在主线程上。 在这里阅读。