使用throng,SIGINT侦听器不会阻止退出节点

时间:2017-03-24 20:10:29

标签: node.js multithreading

这个问题与节点模块throng有关 如节点文档中所述,当在SIGINT或/和SIGTERM上定义侦听器时,节点应防止退出。但throng将永远退出。

  

如果其中一个信号安装了侦听器,则其默认行为   将被删除(Node.js将不再退出)。

https://nodejs.org/api/process.html#process_signal_events

如何重现

使用GitHub上的默认示例并注释掉process.exit行,节点仍将退出该进程。

const throng = require('./lib/throng');

throng({
  workers: 1,
  master: startMaster,
  start: startWorker
});

// This will only be called once 
function startMaster() {
  console.log(`Started master`);
}

// This will be called four times 
function startWorker()(id) {
  console.log(`Started worker ${ id }`);

  process.on('SIGTERM', () => {
    console.log(`Worker ${ id } exiting...`);
    console.log('(cleanup would happen here)');
    //process.exit();
  });
} 

在macOS 10.12.3,NodeJS 7.7.3和throng 4.0.0

上测试

在没有startWorker的情况下测试throng方法会有效。这个过程不会停止。所以这必须是throng上的问题。

有没有人已经使用throng获得过这样的经历并且可以向我解释这种行为?

1 个答案:

答案 0 :(得分:1)

这肯定是一个错误,因为开发人员在其模块描述和示例中完全指定了它。 尽管如此,我认为它从一开始就无法正常工作,因为当主进程关闭时,所有子进程都将自动终止。等待儿童进程的结束没有提供。 开发人员似乎已经认识到这一点。处理这个问题的gint 2 pull请求。