JavaScript的Event Loop与Node.js的异步非阻塞I/O有什么区别?
Node.js异步I/O与原生JS Event Loop的差异说明
首先明确结论:二者存在本质差异,“异步非阻塞I/O”也不是为了推广Node.js造的换皮概念。
- 设计目标完全不同
浏览器端原生JS的Event Loop,核心作用是协调JS执行、DOM渲染、用户交互、网络请求等任务,避免单线程阻塞页面响应,I/O类操作只是其覆盖的场景之一。
而Node.js的Event Loop从设计之初就是服务于服务端高频I/O场景的,包括文件读写、数据库请求、网络套接字通信等,所有这类耗时I/O操作都会下沉到libuv线程池处理,完成后再把回调丢回Event Loop调度执行,这才是“非阻塞异步I/O”的核心,它描述的是I/O操作的执行模式,和Event Loop本身不是同一个概念。 - 循环执行逻辑差异明显
浏览器的Event Loop仅划分宏任务、微任务两个大类,执行规则是每次取一个宏任务执行,之后清空当前所有微任务,再进入渲染流程。
Node.js的Event Loop则划分了6个明确的执行阶段:- timers:处理
setTimeout、setInterval的到期回调 - pending callbacks:处理系统操作的错误回调
- idle/prepare:仅内部使用
- poll:轮询获取新的I/O事件,绝大多数回调都在这个阶段执行
- check:处理
setImmediate的回调 - close callbacks:处理连接关闭类的事件回调
它只会在两个相邻阶段切换的时候才会清空当前所有微任务,和浏览器的执行逻辑完全不同,同一段包含定时器、微任务的代码,在浏览器和Node中运行的输出顺序很可能不一致。
- timers:处理
- 概念来源不存在营销包装
“异步非阻塞I/O”是早在Node.js出现之前就已经存在于服务端开发领域的成熟概念,Node.js只是把JS单线程+Event Loop的模式和异步I/O能力做了结合,降低了开发高并发网络服务的门槛,不存在把Event Loop换个名字做营销的情况。
内容的提问来源于stack exchange,提问作者Flame of udun
相关产品推荐
相关产品推荐

