启动一个新的worker进程。只能由主进程调用。(在调用之前判断cluster.isMaster) cluster.disconnect([callback])
调用此方法的时候,所有的worker将提交一个优雅的结束。当所有的worker都失去全局的连接,并且全局的控件也关闭,没有事件等待,此时主进程(master process)将优雅的结束
结束的时候,这个方法接收一个可配置的callback参数。 cluster.worker
Object类型
对当前worker对象的引用。在主进程程不可用。
var cluster = require('cluster');
if (cluster.isMaster) {
console.log('I am master');
cluster.fork();
cluster.fork();
} else if (cluster.isWorker) {
console.log('I am worker #' + cluster.worker.id);
}
cluster.workers
Object类型
存储所有workds对象的hash,通过id作为key来标志。非常使得的循环所有的worker。只在主进程中可用。
// Go through all workers
function eachWorker(callback) {
for (var id in cluster.workers) {
callback(cluster.workers[id]);
}
}
eachWorker(function(worker) {
worker.send('big announcement to all workers');
});
可能你会通过一个交流频道来与worker的引用交流,使用worker的唯一ID可以很快找出worker
socket.on('data', function(id) {
var worker = cluster.workers[id];
});
Class: Worker
包仿worker所有公共信息和方法的Worker对象。在主进程中可以通过cluster.workers获得。在worker中,可能通过cluster.worker获得 work.id
String类型
每一个Worker提供独立的id,存储在id属性中
当一个worker存活着的时候,这个key标识在cluster.workers中 worker.process
ChildProcess Object 类型
所有的workers都是通过child_process.fork()创建的,它的返回值被存储在process属性中 worker.suicide
Boolean类型
.destroy()后worker挂掉,或者在调用.disconnect()方法后,将设置此属性。否则它的值是undefined worker.send(message, [sendHandle])
参数:message [Object]
sendHandle [Handle object]
这个方法等同于child_process.fork()。在主进程中,可以使用此方法发送一个消息到指定的worker中。在worker中,一样可以发送一个消息到主进种中,完成同样的功能。
if (cluster.isMaster) {
var worker = cluster.fork();
worker.send('hi there');
} else if (cluster.isWorker) {
process.on('message', function(msg) {
process.send(msg);
});
} worker.destroy()
这个方法杀掉worker,然后通知主进行不再启动一个新的worker。Boolean值suicide让你区分出是正常,或者意外退出。
cluster.on('exit', function(worker, code, signal) {
if (worker.suicide === true) {
console.log('Oh, it was just suicide\' – no need to worry').
}
});
// destroy worker
worker.destroy(); worker.disconnect()
当调用此方法的时候,worker不再接收新的连接请求,但它被其他监听着的worker控制。已存在的连接将会允许正常情的退出。已没有连接存在的情况下,worker的IPC频道将关闭,允许worker优雅的结束。IPC频道关闭时触发disconnect事件,跟着是exit事件,在worker完全退出的时候。
也许有长的存活的连接存在,最好是实现一个timeout函数。示例里,呼叫worker断开连接,并在2秒后结束server。一个可供选择的去执行worker.destroy()在两提前后,但它不能使用worker去正常的执行一些必需的清理工作。
if (cluster.isMaster) {
var worker = cluster.fork();
var timeout;
worker.on('listening', function(address) {
worker.disconnect();
timeout = setTimeout(function() {
worker.send('force kill');
}, 2000);
});
worker.on('disconnect', function() {
clearTimeout(timeout);
});
} else if (cluster.isWorker) {
var net = require('net');
var server = net.createServer(function(socket) {
// connection never end
});
server.listen(8000);
server.on('close', function() {
// cleanup
});
process.on('message', function(msg) {
if (msg === 'force kill') {
server.destroy();
}
});
} Event: 'message'
参数:message [Object]
这个事件与child_process.fork()提供的相同。在主进程中,可以使用这个事件,在worker中,可以使用process.on('message')
示例,主进程使用消息系统发送多个requrest:
var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
// Keep track of http requests
var numReqs = 0;
setInterval(function() {
console.log("numReqs =", numReqs);
}, 1000);
// Count requestes
function messageHandler(msg) {
if (msg.cmd && msg.cmd == 'notifyRequest') {
numReqs += 1;
}
}
// Start workers and listen for messages containing notifyRequest
var numCPUs = require('os').cpus().length;
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', messageHandler);
});
} else {
// Worker processes have a http server.
http.Server(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
// notify master about the request
process.send({ cmd: 'notifyRequest' });
}).listen(8000);
} Event: 'online'
与cluster.on('online')相同的事件,指定的worker发生状态改变时触发。
cluster.fork().on('online', function() {
// Worker is online
}; Event: 'listening'
参数:address Object
与cluster.on('listening')相同的事件,指定的worker发生状态改变时触发。
cluster.fork().on('listening', function(address) {
// Worker is listening
};