Node js:libuv 线程池如何工作?

问题描述 投票:0回答:2

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

当任何事件发生时,它都会进入事件队列,然后在运行任务结束后被堆栈拾取,如果事件是非阻塞事件,则会发生这种情况,但如果它是阻塞请求,则事件循环会将其传递给来自 libuv 线程池的线程。

现在我的疑问是:

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

  2. libuv 中的线程池多了 3 个线程,现在假设 10 个用户尝试登录并且每个人同时(某些应用程序如 facebook 等),仅此而已,并且线程在想要连接到数据库时被阻止,所以怎么只有三个线程就能处理这么大的负载?

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

javascript node.js event-loop libuv
2个回答
10
投票

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

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

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

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

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


1
投票

执行结束后,libuv 线程会将请求传递回事件队列或事件循环吗?

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

2) libuv 中的线程池多了 3 个线程,现在假设有 10 个用户 尝试同时登录每个人(一些应用程序,例如 facebook 左右),如何仅 和 线程在想要连接时被阻塞 到数据库,那么如何仅三个线程就能处理如此大的负载?

libuv 使用威胁池,但不是以“天真的”方式。大多数异步请求是通过

select()
处理的文件系统/tcp 交互。仅当您创建自定义 C++ 模块并手动调度 CPU/IO 阻塞任务时,您才需要担心线程池。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.