javascript - 为什么 Node.js 每个进程旋转 7 个线程

标签 javascript node.js worker-thread

当 Node.js 进程启动时,top 命令显示有 7 个线程附加到该进程。所有这些线程在做什么?此外,随着 API 负载的增加,请求处理程序本身会异步等待其他上游 API 调用,Node 会产生额外的工作线程吗?我在顶部看到它这样做了。但我认为这只发生在文件 I/O 上。为什么它需要这些额外的工作线程?

最佳答案

LIBUV(node.js 构建的底层跨平台系统库)使用线程池进行某些操作,例如磁盘 I/O 和一些加密操作。默认情况下,线程池包含 4 个线程。

此外,还有一个用于执行 Javascript 的线程,因此占 5 个。

然后,似乎有一个线程被垃圾收集器用于对象的后台标记(根据 this reference from a V8 developer )和 this article .那就是 6。

我不确定第 7 个会是什么。事件循环本身可能使用了一个线程。

然后,从 2018 年左右开始,nodejs 似乎切换到一组单独的线程来处理 DNS 请求(与文件 I/O 线程池分开)。这可能是因为 node.js 中的问题,其中 4 个慢速 DNS 请求可能会阻塞所有文件 I/O,因为它们接管了线程池。所以,现在看起来 node.js 使用了 C-ARES library为 DNS 创建自己的线程集。

仅供引用,您实际上可以使用 UV_THREADPOOL_SIZE 环境变量控制线程池大小。


当然,您可以创建自己的工作线程,这些工作线程实际上会创建 V8 Javascript 执行引擎的新实例(因此它们最终可能会创建多个新线程)。

关于javascript - 为什么 Node.js 每个进程旋转 7 个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61550822/

相关文章:

java - 什么是在浏览器中运行的简单位图编辑器(jquery/java/javascript)?

javascript - 无法再通过 CMD+D 打开开发菜单或通过 CMD+R 重新加载

node.js - 使用角色管理用户的AWS账户

node.js - 运行 V8 javascript 引擎示例代码时出错

node.js - 在electron应用中,当我使用worker_thread时,使用Command+Q退出应用后出现异常

android - Android 4.0.3 上的 NetworkOnMainThreadException

javascript - 如何从另一个线程向多个线程发送消息?

javascript - TypeScript XAML 框架

javascript - 如何在 html 侧边栏中包含选中所有框

node.js - 与 meteor 同步