默认情况下:一个 Node 进程
一个 Node 应用启动后,通常对应 一个 Node 进程,这个进程里会包含几类关键执行角色:
1. JS 主线程
- 负责执行业务 JavaScript 代码
- 负责跑 事件循环 Event loop
- 会处理同步代码、宏任务、微任务
- Node 中的
process.nextTick属于比 Promise 更靠前的一类微任务,可以和微任务一起记
这里要注意:“JavaScript 单线程”说的是执行 JS 代码的主线程,不是说整个 Node 进程里只有一个线程。
这点可以和 为什么 js 是单线程 一起理解。
2. V8 引擎相关线程
- Node 基于 V8 执行 JavaScript
- 垃圾回收、JIT 编译等底层工作并不等于都在 JS 主线程里完成
如果从面试回答角度,不一定要展开到底层线程细节,但要知道 Node 不是“只有一个线程”的字面意思。
3. libuv 线程池 / 辅助线程
- 一些 I/O、文件读写、DNS、压缩、加密等任务,会交给底层线程池处理
- 处理完之后,再把回调结果交还给主线程进入 事件循环 Event loop
所以 Node 的高并发能力,并不是“一个线程什么都做”,而是:
- JS 主线程负责调度和执行回调
- 底层线程或系统能力负责耗时工作
这和浏览器里“JS 主线程 + Web API/宿主能力”有点像,但整体架构又不同,可以对照 浏览器包含哪些进程 来记。
Node 默认不是什么“多进程架构”
如果不额外做处理,Node 默认不是像浏览器那样:
- 一个主进程
- 多个渲染进程
- GPU 进程
- 插件进程
Node 默认更接近:
- 一个进程
- 这个进程里有一个执行 JS 的主线程
- 再配合一些底层工作线程
所以如果面试官问“Node 包含哪些进程”,一个很稳妥的回答是:
Node 默认通常只有一个进程;但这个进程内部不是只有一个线程,而是由 JS 主线程、事件循环机制和底层线程池一起协作完成任务。
什么时候 Node 会变成“多进程”
当我们主动使用下面这些方案时,Node 才会扩展成多进程模型:
child_processcluster- 进程守护/部署工具(例如 PM2 的 cluster 模式)
这时通常会出现:
- 一个主控进程
- 多个 worker 子进程
这样做的核心目的通常是:
- 利用多核 CPU
- 隔离故障
- 提升吞吐量
但要注意:这已经不是“Node 默认自带哪些进程”,而是“你主动把 Node 应用扩展成多进程”。
和浏览器做一个对比
浏览器
Node
- 默认通常只有一个进程
- 重点不是“有多少进程”,而是“一个进程里如何协调线程、I/O 和 事件循环 Event loop”
面试时可以怎么回答
可以直接答:
Node 默认一般只有一个进程,不像浏览器那样天然是多进程架构。
但这个进程内部也不只是一个线程,通常是 JS 主线程负责执行代码和事件循环,底层还有 V8 和 libuv 相关线程协助处理垃圾回收、文件 I/O、网络等任务。
如果使用child_process、cluster之类能力,Node 才会扩展成多进程模型。