一、这个技术是什么?
服务器同时面对很多请求。如果每个请求都等待文件、网络或数据库返回,主线程就会被长时间占用,其他请求也无法及时处理。
事件循环让 Node.js 可以先发起异步任务,暂时处理其他工作,等 I/O 完成后再回来继续执行。
二、没有它之前发生了什么?
一个请求同步等待 I/O
↓
主线程被占用
↓
其他请求排队等待
↓
并发请求导致吞吐量下降
↓
事件循环和异步回调出现
三、核心概念
1. Call Stack
调用栈记录当前正在执行的 JavaScript 函数。栈被长时间占用时,事件循环无法继续处理其他任务。
2. Task Queue
异步任务完成后,回调会进入相应队列,等待事件循环安排执行。
3. Microtask
Promise continuation 和 queueMicrotask 等微任务通常会在合适时机优先于普通宏任务执行。
4. libuv
libuv 协助 Node.js 处理网络、文件和线程池等异步操作。
5. Blocking
复杂计算、大量同步文件操作或无限循环会阻塞事件循环,影响同一进程中的其他请求。
四、运行流程
五、面试复习
一句话回答
Node.js 通过事件循环协调异步任务,让主线程不必同步等待 I/O;但耗时同步计算会阻塞事件循环,拖慢同一进程的所有请求。
高频追问
setTimeout、Promise 和process.nextTick的执行顺序如何理解?- Node.js 单线程为什么可以处理并发?
- 如何发现事件循环被阻塞?
- CPU 密集任务应该怎么处理?
容易答错
不要把并发和并行混为一谈。事件循环擅长协调等待中的任务,不代表 JavaScript 主线程可以同时执行多个计算任务。
六、项目展示
在 API 项目中,可以通过避免同步文件操作、拆分 CPU 密集任务、增加超时和监控事件循环延迟来提高服务稳定性。