Node.js群集 - 无法关闭http.Server或退出进程

时间:2013-09-18 12:08:31

标签: node.js

我目前正在使用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();
}

我仍然不知道为什么工人的超时不会触发,但只要它关闭......

1 个答案:

答案 0 :(得分:1)

您应该阅读域文档中的cluster example

有趣的位:

  • 您可以使用cluster.worker.disconnect()手动断开工作人员。
  • 您可以使用setTimeout阻止timeout.unref()使进程保持活动状态。
  • server.close会在调用回调之前等待所有连接终止,这可能需要一段时间。