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

时间:2018-06-06 10:50:29

标签: node.js event-loop libuv

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

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

现在我怀疑的是: 1)一旦执行结束,libuv线程会将请求传递回事件队列或事件循环吗? ,不同的教程有不同的场景。

2)libuv中的线程池有3个线程,现在假设有10个用户同时尝试登录并且每个人(像facebook这样的某个应用程序),如何,以及线程被阻止,因为他们想要连接到DB,那么如何只有三个线程处理如此多的负载?

我真的很困惑,并没有在任何地方得到这些疑问的好解释,任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

  

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

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

  

2)libuv中的线程池有3个线程,现在假设有10个用户   尝试同时登录和每个人(一些像Facebook的应用程序   左右),如何,以及线程被阻止,因为他们想要连接   到DB,那么只有三个线程可以处理如此多的负载呢?

libuv使用威胁池,但不会使用#na; naive"办法。大多数异步请求是文件系统/ tcp交互,通过select()处理。只有在创建自定义C ++模块并手动调度CPU / IO阻塞任务时,才必须担心线程池。

答案 1 :(得分:0)

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

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

如果这是一个阻塞请求,那么事件循环会将其从libuv的线程池传递给线程。

只有四件事使用线程池-DNS查找,fs,crypto和zlib。不论是否阻塞,其他所有内容都在主线程中执行。

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