Node.js 是单线程吗?CPU 密集任务与 I/O 密集任务怎样处理?

先理解原理和示例,再练习完整口述与追问。

一个执行环境的 JS 主线程;系统异步 I/O、线程池与 Worker;线程与进程隔离;任务池与传输成本。

“单线程”通常指一个 Node 执行环境中的 JavaScript 回调主要在同一线程执行,不表示整个进程没有其他线程。部分网络 I/O 借操作系统能力,部分文件、加密等工作可能用 libuv 线程池。长时间同步 JavaScript 会占用主线程,使其他请求回调无法及时处理。

CPU 密集的解析和计算可评估 worker_threads 或独立服务;Worker 可并行执行 JS,并可转移或共享适用的二进制内存。进程提供更强的隔离,也可多进程分担请求。普通异步 I/O 已有高效机制,不应每个请求新建 Worker;池化还需队列、超时、背压和故障回收。

一个请求同步压缩计算耗时 2 秒,其他已就绪请求也会等它;把计算提交固定大小的 Worker 池,主线程继续接受请求。传输 500MB 对象若发生大量克隆,收益可能被抵消,可按数据格式评估转移 ArrayBuffer,并限制排队量。

async 函数里的同步计算不会自动转线程。Worker 不适合所有 I/O,过多线程或进程也会争抢 CPU 和内存。

Node 不是只有一个线程,而是每个 JS 执行环境主要单线程处理回调。我用异步 I/O 避免阻塞,CPU 重活按测量结果放 Worker 池或独立进程,控制任务排队与内存,并计入创建和数据传输成本。Node Worker 文档