即使被信号处理程序中断,node.js代码也会运行完成吗?

时间:2015-03-27 18:17:05

标签: javascript node.js

假设我在node.js中有以下代码:

process.on('SIGTERM', function () {
    process.exit(0);
});

for (var i = 0; i < 100; i++) {
   console.error(i);
}

代码是否始终打印最多100个数字?

1 个答案:

答案 0 :(得分:3)

这很容易测试:

process.on('SIGTERM', function () {
  console.log('*** GOT SIGTERM ***');
  process.exit(0);
});

process.kill(process.pid);

for (var i = 0; i < 100; i++) {
 console.error(i);
}

结果表明,确实for循环确实已完成,但这是误导性的for循环阻止I / O.由于Node是单线程的,因此在process.exit(0)循环完成之前不会调用for

更具说明性的例子:

process.on('SIGTERM', function () {
  console.log('*** GOT SIGTERM ***');
  process.exit(0);
});

process.kill(process.pid);

setTimeout(function() {
  for (var i = 0; i < 100; i++) {
   console.error(i);
  }
}, 1000);

这里我们使用setTimeout等待1秒,然后再进行for循环。节点的事件循环将在此期间继续运行,因此process.on('SIGTERM')将在for循环开始之前调用。结果不同: for循环根本不运行

调用process.exit(0)后,应用程序结束,不会执行任何其他操作。当调用 process.exit(0)时,两个示例之间的区别是