我目前正在使用节点的集群模块来利用多个核心。但是,我无法使用以下命令优雅地关闭节点 0.10.18 上的工作程序 - 请参阅函数 serverClose():
[master.js]
cluster.on('disconnect', function(worker) {
console.log('exit #4')
});
cluster.on('exit', function(worker) {
console.log('exit #5')
});
[工人.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 服务器正确地停止接受传入的连接,但是您会惊讶地发现不会触发任何日志语句吗?服务器停止,但进程不会退出,并且集群不会创建新的工作人员。
[编辑]
多亏了 Laurent,以下内容对我来说似乎很可靠:
[master.js]
cluster.on('disconnect', function(worker) {
setTimeout(function() {
worker.kill();
}, 1000 * 30);
cluster.fork();
});
[工人.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();
}
我仍然不知道为什么工人的超时不会触发,但只要它被关闭......