NodeJS执行同步高开销for循环为何会创建并行线程/进程?
为什么纯同步Node.js代码运行时进程会创建11个线程?
测试所用代码如下:
console.time('Time spending'); let list = []; for (let index = 0; index < 1000000; index++) { const data = JSON.stringify({ id: Date.now(), index, }); list.push(data); } console.log(list); console.timeEnd('Time spending');
这是对Node.js线程模型的典型误解:常说的"Node.js单线程"仅指JS业务代码运行在单个事件循环主线程上,整个Node.js进程从启动开始就不是单线程的,这些内置线程和你写的JS代码是同步还是异步没有直接绑定关系,哪怕你跑最简单的helloworld脚本,这些线程也会被创建。
这些默认初始化的线程主要分为三类:
- V8引擎后台线程:负责JIT动态编译优化、垃圾回收全流程(标记、清理、内存压缩)、代码解析等底层任务,这部分是V8引擎的默认配置,和上层业务逻辑完全无关,一般会占用4-6个线程。
- libuv 线程池:默认大小为4个线程,可通过
UV_THREADPOOL_SIZE环境变量调整,专门处理操作系统没有提供原生异步接口的阻塞型任务,比如文件IO、非系统级DNS解析、加解密、压缩解压等操作,即使业务代码暂时没调用相关能力,Node.js启动时也会完成线程池的基础初始化。 - 平台适配辅助线程:在WSL2的Ubuntu环境下,还会额外创建信号处理、控制台IO、性能采样、进程状态维护相关的辅助线程,用来适配Linux系统调用要求,一般会有1-2个。
你观测到的11个线程完全属于正常范围:1个JS主线程 + 4-6个V8后台线程 + 4个libuv线程池线程 + 1-2个平台辅助线程,总数正好落在10-12的常规区间,和你写的同步循环生成JSON的逻辑没有任何关系。你可以写一个仅包含setInterval(() => {}, 1000)的空脚本测试,观测到的线程数和当前结果基本一致。
运行状态参考截图:
内容的提问来源于stack exchange,提问作者Gustavo Farias
相关产品推荐
相关产品推荐

