Node.js 的事件循环(Event Loop)是什么?为什么这么叫?
"事件循环"是 Node.js 的核心机制之一,它负责调度所有异步任务,让单线程的 JavaScript 实现高并发处理。
🌪️ 为什么叫"事件循环"?
你可以把 Node.js 想象成一个值班机器人,它每天的工作流程如下:
- 👀 检查是否有新任务(定时器、网络、文件读取等)
- 🧾 把任务排队
- 🔁 一轮一轮地调度并执行任务(每一轮称为一个 tick)
- 💤 暂时没任务就等待,直到新的事件触发
这种一轮一轮检查并处理事件的机制,就是"事件循环"。
🔄 每一轮事件循环都在处理什么?
Node.js 的事件循环分成几个阶段,每个阶段处理特定的任务队列:
阶段 | 处理内容 |
---|---|
Timers | 执行 setTimeout() 和 setInterval() 的回调 |
Pending Callbacks | 某些系统操作(如 TCP 错误)的回调 |
Poll | 轮询 I/O 操作,例如文件读取和数据库查询 |
Check | 执行 setImmediate() 的回调 |
Close Callbacks | 处理关闭事件的回调,例如 socket.on('close') |
Microtasks(贯穿各阶段) | 执行 Promise、process.nextTick() 、queueMicrotask() 等任务 |
👨🏫 举个通俗例子
假设你是老师,教室里每天都安排这些事情:
- 上课(同步任务)
- 批改作业(微任务)
- 课后值日生打扫(宏任务)
老师每天都按照这个流程循环进行,Node.js 事件循环就是类似的值班机制,确保每件事都按顺序安排执行。
💡 为什么这机制对开发者重要?
- 保证异步任务不会阻塞主线程
- 控制执行顺序(比如微任务优先)
- 理解后能写出更高效的 Promise/async 代码
- 处理并发任务更精准
想进一步搞懂 async/await 怎么在事件循环中安排执行?我可以带你写一个模拟的小例子 ✨