cub*_*nux 2 javascript worker-thread node.js
当 Node.js 进程启动时,top 命令显示有 7 个线程附加到该进程。所有这些线程都在做什么?此外,随着 API 负载的增加,请求处理程序本身会异步等待其他上游 API 调用,Node 是否会产生额外的工作线程?我在顶部看到它确实做到了这一点。但我认为这只发生在文件 I/O 上。为什么需要这些额外的工作线程?
LIBUV(node.js 构建的底层跨平台系统库)使用线程池来执行某些操作,例如磁盘 I/O 和一些加密操作。默认情况下,线程池包含 4 个线程。
另外,还有一个线程用于执行 Javascript,因此占 5 个。
然后,垃圾收集器似乎使用一个线程来进行对象的后台标记(根据V8 开发人员的此参考)和本文。这样就可以得到 6 个。
我不确定第七个会是什么。事件循环本身可能使用一个线程。
然后,从 2018 年左右开始,nodejs 似乎切换到一组单独的线程来处理 DNS 请求(与文件 I/O 线程池分开)。这可能是因为 Node.js 中存在问题,其中 4 个缓慢的 DNS 请求可能会阻塞所有文件 I/O,因为它们接管了线程池。所以,现在看来,node.js 使用了DNS 的C-ARES 库,它创建了自己的线程集。
仅供参考,您实际上可以使用环境变量控制线程池大小UV_THREADPOOL_SIZE。
当然,您可以创建自己的工作线程,这些线程实际上创建 V8 Javascript 执行引擎的新实例(因此它们最终可能会创建多个新线程)。
| 归档时间: |
|
| 查看次数: |
861 次 |
| 最近记录: |