【问题标题】:Node js : how libuv thread pool works?Node js:libuv 线程池是如何工作的?
【发布时间】:2018-06-06 10:50:28
【问题描述】:

我正在学习Node Js,我了解Node js的核心是基于事件循环的反应器模式。

当任何事件发生时,它会进入事件队列,然后在运行的任务结束后被堆栈拾取,如果事件是非阻塞事件,则会发生这种情况,但如果它是阻塞请求,则事件循环通过从 libuv 的线程池到一个线程。

现在我的疑问是:

  1. 一旦执行结束,libuv 线程是否会将请求传递回事件队列或事件循环? ,不同的教程有不同的场景。

  2. libuv 中的线程池多了 3 个线程,现在假设有 10 个用户尝试登录并且每个人同时登录(一些应用程序,例如 facebook 左右),只是如何,线程在他们想要连接时被阻塞到DB,那么只有三个线程怎么处理这么多负载呢?

我真的很困惑,在任何地方都没有很好地解释这些疑问,我们将不胜感激。

【问题讨论】:

  • Libuv 默认使用 4 个线程,但是可以使用 UV_THREADPOOL_SIZE 进行更改。

标签: node.js event-loop libuv


【解决方案1】:

当任何事件发生时,它会进入事件队列,然后被堆栈拾取

事件不会被堆栈拾取。它通过事件循环传递给调用堆栈。

如果是阻塞请求,则事件循环将其从 libuv 的线程池传递给线程。

只有四种使用线程池的东西 - DNS 查找、fs、crypto 和 zlib。其他一切都在主线程中执行,无论是否阻塞。

所以日志是一个网络请求,线程池不处理这个。 libuv 和 node 都没有任何代码来处理与网络请求相关的低级操作。相反,libuv 将请求委托给底层操作系统,然后它只是等待操作系统发出信号,表明某些响应已返回到请求。操作系统跟踪网络堆栈中的连接。但是网络 i/o 由您的网络硬件和您的 ISP 处理。

【讨论】:

  • 只有一句话。自定义 C++ 模块也可能使用线程池。
【解决方案2】:

一旦执行结束,libuv 线程是否会将请求传递回事件队列或事件循环?

从 node.js 的角度来看,它有什么不同吗?

2) libuv 中的线程池多了 3 个线程,现在假设有 10 个用户 尝试同时登录和所有人(一些应用程序,如 facebook 左右),如何 only 和线程在他们想要连接时被阻塞 到 DB,那么只有三个线程如何处理这么多的负载?

libuv 使用威胁池,但不是以“幼稚”的方式。大多数异步请求是通过select() 处理的文件系统/tcp 交互。只有在创建自定义 C++ 模块并手动调度 CPU/IO 阻塞任务时,您才需要担心线程池。

【讨论】:

  • 一些加密函数也不能轮询。
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 2018-01-20
  • 2014-09-27
  • 2014-05-16
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多