我目前正在使用node的Cluster模块来使用多个内核。但是,我无法使用以下方法正常关闭节点0.10.18上的worker - 请参阅function serverClose():
[master.js]
cluster.on('disconnect', function(worker) {
console.log('exit #4')
});
cluster.on('exit', function(worker) {
console.log('exit #5')
});
[worker.js]
server = http.createServer(function(req,res) {
//
}).on('close', function() {
console.log('exit #1')
process.exit();
}).listen(80);
function serverClose() {
setTimeout(function() {
console.log('exit #2')
process.exit();
}, 1000 * 5);
server.close(function() {
console.log('exit #3')
process.exit();
});
}
http服务器正确地停止接受传入连接,但是如果知道没有任何日志语句会触发,你会感到惊讶吗?服务器停止但进程不会退出,并且sp群集不会创建新的worker。
[编辑]
感谢Laurent,以下似乎对我来说可靠:
[master.js]
cluster.on('disconnect', function(worker) {
setTimeout(function() {
worker.kill();
}, 1000 * 30);
cluster.fork();
});
[worker.js]
server = http.createServer(function(req,res) {
//
}).listen(80);
function serverClose() {
var killTimeout = setTimeout(function() {
console.log('this never fires, so the process must be shut down by the master');
process.exit(1);
}, 1000 * 15);
killTimeout.unref();
server.close();
cluster.worker.disconnect();
}
我仍然不知道为什么工人的超时不会触发,但只要它关闭......
答案 0 :(得分:1)
您应该阅读域文档中的cluster example。
有趣的位:
cluster.worker.disconnect()
手动断开工作人员。setTimeout
阻止timeout.unref()
使进程保持活动状态。server.close
会在调用回调之前等待所有连接终止,这可能需要一段时间。