即使被信号处理程序中断,node.js代码是否仍然运行完成?

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

process.on('SIGTERM', function () { process.exit(0); }); for (var i = 0; i < 100; i++) { console.error(i); } 

代码将始终打印所有的数字高达100?

这很容易testing:

 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是单线程的,所以在for循环完成之前, process.exit(0)不会被调用。

更具说明性的例子:

 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)被调用时。