Node.js事件循环线程数疑问:修改libuv后出现双线程ID原因
为什么运行空JS文件会出现两个不同的线程ID?
这是因为Node.js基于libuv的线程模型,除了主线程(运行主事件循环),还会维护一个默认的线程池(默认大小为4),用来处理无法在主线程异步完成的任务。哪怕你运行的是空JS文件,Node.js的初始化或内部清理流程也可能触发线程池中的某个线程启动自己的事件循环,而每个事件循环都会调用uv__io_poll函数——这就是你看到两个不同线程ID的原因。
具体细节:
- 重复出现的线程ID(2242949)是主线程,它是Node.js执行JS代码、处理主事件循环的核心线程。空文件执行完毕后,主线程会进入事件循环等待任务,因此多次调用
uv__io_poll。 - 只出现一次的线程ID(2242953)来自libuv线程池,Node.js启动过程中可能有内部异步任务(比如文件系统检查、内部模块的异步初始化)被提交到线程池,这个线程启动后会运行自己的小型事件循环,自然也会调用
uv__io_poll。
你可以做个验证:调整环境变量UV_THREADPOOL_SIZE=1后再运行,或者修改代码只跟踪主线程的事件循环,就能看到更清晰的输出差异。
内容的提问来源于stack exchange,提问作者Akshit Bansal
相关产品推荐
相关产品推荐

