为什么节点产生了几个线程?

我列出了我的节点服务器的线程,以下是标准输出的响应:

$ ps -e -T | grep 14209 14209 14209 ? 00:10:08 node 14209 14415 ? 00:00:00 V8 WorkerThread 14209 14416 ? 00:00:00 V8 WorkerThread 14209 14417 ? 00:00:00 V8 WorkerThread 14209 14418 ? 00:00:00 V8 WorkerThread 14209 14419 ? 00:00:00 node 14209 15894 ? 00:00:00 node 14209 15895 ? 00:00:00 node 14209 15896 ? 00:00:00 node 14209 15902 ? 00:00:00 node 

我已经了解到nodejs是单线程的,同一个线程负责处理javascript代码。 那么,最后五个线程的目的是什么呢? 它们是由处理asynchronousI / O的libuv产生的吗?

那么,最后五个线程的目的是什么呢? 它们是由处理asynchronousI / O的libuv产生的吗?

至less其中的一些(如果不是全部的话)是由于libuv ,是的。
该库有一个主要用于fs请求的线程池(在文档中明确提到),即使不仅仅是为了他们:

libuv提供了一个线程池,可以用来运行用户代码并在循环线程中得到通知。 此线程池在内部用于运行所有文件系统操作,以及getaddrinfo和getnameinfo请求。

这是因为像fs请求这样的东西本质上是同步的,让它们看起来asynchronous的唯一方法是在不同线程上产生请求,然后在主线程上处理响应。

也就是说,JavaScript环境是单线程的,但是它并不强制底层库(主要是v8libuv )不为内部使用线程。 只要JavaScript运行时显示给用户单线程,没有理由不使用线程。
实际上,这些库在一定程度上可以执行任务并提高性能:它们产生线程并在内部使用它们。