我列出了节点服务器的线程,以下是对stdout的响应:
$ 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代码。那么,最后五个线程的目的是什么?它们是由处理异步I / O的libuv
生成的吗?
答案 0 :(得分:1)
那么,最后五个线程的目的是什么?它们是由处理异步I / O的libuv生成的吗?
至少其中一些(如果不是全部)归于libuv
,是的
该库有一个线程池(它在documentation中明确提到)主要用于fs请求,即使不仅仅是为了它们:
libuv提供了一个线程池,可用于运行用户代码并在循环线程中得到通知。此线程池在内部用于运行所有文件系统操作,以及getaddrinfo和getnameinfo请求。
这是因为像fs请求这样的东西本质上是同步的,使它们看起来异步的唯一方法是在不同的线程上产生请求,然后处理主线程上的响应。
话虽如此,JavaScript环境确实是单线程的,但它并不强制底层库(主要是v8
和libuv
)不在内部使用线程来实现它们的目的。只要JavaScript运行时对用户显示为单线程,就没有理由不使用线程
实际上,正是这些库在某种程度上可以执行任务并提高性能:它们生成线程并在内部使用它们。