请解释 Node.js 的事件驱动架构,并说明其线程模型。Node.js 是否采用单线程模型?如果是,请从底层机制和设计原因两方面加以阐述。
考察说明
考察对 Node.js 线程模型的理解,包括单线程的含义、事件循环机制以及设计初衷。
回答思路
- 【回答框架 1】Node.js 基于单线程运行 JavaScript 代码,但底层依赖 libuv 线程池处理 I/O 等异步操作。核心是事件循环,它使主线程不会被阻塞。
- 【回答框架 2】单线程指的是主事件循环只有一个,所有 JavaScript 代码按顺序执行。但异步操作(如文件读取、网络请求)会委托给 libuv 线程池,完成后通过回调通知主线程。
- 【回答框架 3】设计原因包括:简化并发编程,避免多线程导致的条件竞争和锁问题;I/O 密集型应用性能高,因为大部分时间在等待 I/O,事件循环能高效利用 CPU。
- 【回答框架 4】需要注意:单线程意味着主线程不能执行耗时 CPU 任务,否则会阻塞事件循环,导致整个应用响应延迟。
- 【关键点 1】Node.js 主线程是单线程,但配合事件循环和 libuv 线程池实现异步非阻塞 I/O。
- 【关键点 2】事件循环是核心,负责调度回调。
- 【关键点 3】设计初衷是提高 I/O 密集型应用的并发处理能力并简化并发编程。
- 【易错点 1】容易忽略 libuv 线程池的存在,误以为整个 Node.js 都是单线程。
- 【易错点 2】不能因为单线程就否定线程池的存在,两者是不同层面的抽象。