事件驱动与非阻塞 I/O
“事件驱动”指程序流程由事件(I/O 完成、定时器触发、新连接到达)推动,而不是从头到尾顺序执行。“非阻塞”指遇到耗时的 I/O 操作时,主线程不等待,先去做别的,完成后再通过回调处理结果。
幕后功臣是 libuv 提供的事件循环(Event Loop):它像一个不知疲倦的分发员,不断轮询“哪些任务完成了”,然后执行对应的回调。前端的 setTimeout、Promise 的底层机制与它是同一套思想,理解了事件循环,Node.js 的异步行为就有了抓手。
- 非阻塞 I/O:读文件/发请求时主线程不干等,先执行后续代码
- 事件循环(libuv)负责在 I/O 完成后调度回调
- 单线程不等于“只有一个线程”:I/O 交给系统线程池,JS 逻辑跑在单线程上
JS
// 用定时器直观感受事件驱动的执行顺序 console.log('1. 同步代码开始'); setTimeout(() => console.log('3. 定时器回调(事件循环在同步代码结束后才处理)'), 0); // Node 环境下读文件,回调由 libuv 线程池完成后投递回事件循环 const fs = require('fs'); fs.readFile(__filename, () => console.log('4. 文件读取完成回调')); console.log('2. 同步代码结束');
本节要点非阻塞让 I/O 不卡主线程,事件循环负责“完成后执行回调”;单线程指的是 JS 执行线程,I/O 仍在底层多线程完成。




