为什么节点会产生多个线程?

时间:2017-11-07 14:04:01

标签: node.js asynchronous io libuv

我列出了节点服务器的线程,以下是对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生成的吗?

1 个答案:

答案 0 :(得分:1)

  

那么,最后五个线程的目的是什么?它们是由处理异步I / O的libuv生成的吗?

至少其中一些(如果不是全部)归于libuv,是的 该库有一个线程池(它在documentation中明确提到)主要用于fs请求,即使不仅仅是为了它们:

  

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

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

话虽如此,JavaScript环境确实是单线程的,但它并不强制底层库(主要是v8libuv)不在内部使用线程来实现它们的目的。只要JavaScript运行时对用户显示为单线程,就没有理由不使用线程 实际上,正是这些库在某种程度上可以执行任务并提高性能:它们生成线程并在内部使用它们。