Node.js中process.stdout.on('data',...)为何会挂起?
为什么这段Node.js代码会永久挂起?
process.stdout.on('data',function(){});
核心原因
- 事件循环的退出规则:Node.js进程会在事件循环中没有待处理异步任务,且没有活跃的事件监听器时自动退出。但只要存在已绑定的事件监听器(哪怕这个事件永远不会被触发),Node.js就会认为事件循环还有需要处理的潜在任务,不会终止进程。
- EventEmitter的特性:process.stdout继承自
EventEmitter,调用on()绑定事件时,EventEmitter不会校验这个事件是否是当前对象实际会触发的——哪怕WriteStream本身根本不会发出data事件,绑定的监听器依然会被算作“活跃状态”,从而阻止进程退出。
验证与解决
如果在代码末尾添加移除监听器的逻辑,进程就能正常退出:
process.stdout.on('data',function(){}); process.stdout.removeAllListeners('data');
内容的提问来源于stack exchange,提问作者user619271
相关产品推荐
相关产品推荐

