0

我目前正在使用节点的集群模块来利用多个核心。但是,我无法使用以下命令优雅地关闭节点 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();
}

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

4

1 回答 1

1

您应该阅读域文档中的集群示例

有趣的位:

  • 您可以使用 手动断开工作人员的连接cluster.worker.disconnect()
  • 您可以使用 来防止 asetTimeout使进程保持活动状态timeout.unref()
  • server.close将在调用回调之前等待所有连接终止,这可能需要一段时间。
于 2013-09-18T12:29:22.460 回答