节点集群:只给一个worker处理任务
Node cluster: Handle task only to one worker
我正在尝试将集群设置为多线程我的应用程序,但不是为每个工作人员委派一个任务,而是将每个任务都委派给所有工作人员。
我的代码如下:
//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
块的内容,所以每次我向我的 table 中插入一个值时(触发触发并通知我的 pg_client 谁在听)我得到的 console.log
与设置的工人 cluster.isMaster
一样多,但是我希望只有一名工人处理每个 postgres 事件。我怎样才能修复我的代码以实现上述行为?
这样就不需要使用集群了。集群均匀分布处理。
您需要完全更改 if-else-逻辑,因为...
for (var i = 0; i< numWorkers; i++) {
cluster.fork();
}
...明确表示您需要 N 个进程。
而不是 child_process.fork();
会在主线程上显式执行 not。仔细阅读 here。
我正在尝试将集群设置为多线程我的应用程序,但不是为每个工作人员委派一个任务,而是将每个任务都委派给所有工作人员。
我的代码如下:
//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
块的内容,所以每次我向我的 table 中插入一个值时(触发触发并通知我的 pg_client 谁在听)我得到的 console.log
与设置的工人 cluster.isMaster
一样多,但是我希望只有一名工人处理每个 postgres 事件。我怎样才能修复我的代码以实现上述行为?
这样就不需要使用集群了。集群均匀分布处理。
您需要完全更改 if-else-逻辑,因为...
for (var i = 0; i< numWorkers; i++) {
cluster.fork();
}
...明确表示您需要 N 个进程。
而不是 child_process.fork();
会在主线程上显式执行 not。仔细阅读 here。