【问题标题】:Why does node spawn several threads?为什么节点会产生多个线程?
【发布时间】:2018-04-19 23:19:19
【问题描述】:

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

$ 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 生成的吗?

【问题讨论】:

    标签: node.js asynchronous io libuv


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2012-11-30
      • 2023-02-23
      相关资源
      最近更新 更多