即使被信号处理程序中断,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)
被调用时。