节点J是否将libuv线程池用于网络I / O

时间:2018-08-02 12:16:36

标签: node.js libuv

我正在学习Node.js

我已在libuv官方文档中找到此注释-

libuv使用thread pool使得asynchronous file I/O操作成为可能,但是network I/O总是在单个线程(每个循环的线程)中执行。”

我的问题是下面的声明(来自非官方资源)-

  

”“今天的操作系统已经提供了用于   许多I / O任务(例如Linux上的AIO)。只要有可能,libuv将使用   这些异步接口,避免使用线程池。”

-此语句对异步file I/O operations是否适用,还是仅对Network I/O适用?

  1. 表示如果有文件I / O操作,则在这种情况下为线程 池将被强制使用,或者libuv将使用那些异步的 接口,避免使用线程池。 ?
  2. Libuv是否将线程池用于网络I / O?

2 个答案:

答案 0 :(得分:2)

我最近迷上了NodeJS内部组件,V8,D8和libuv。 因此,真正奇怪的事情之一是网络I / O由事件循环处理。但是dns.lookup()由libuv线程池处理。

因此,仅当您提供http.get/http.post作为URL时,事件循环才处理IP。不是主机名。 如果提供了主机名,则它将在内部使用dns.lookup,这将反过来使该操作由线程池处理。

引用:Node's Event Loop From the Inside Out by Sam Roberts, IBM

注意:我仍在学习此内容,因此欢迎进行任何修改。

答案 1 :(得分:0)

对于某些标准库函数调用,节点C ++端和libuv决定完全在事件循环之外进行昂贵的计算,它们形成了一个称为线程池的东西,该线程池是一系列四个线程,可用于运行计算密集型任务,例如哈希函数或读取硬盘驱动器(fs模块函数)中的文件。 使用线程池的只有四件事-DNS查找,fs,crypto和zlib。

因此,正如节点标准库具有使用libuv线程池的某些功能一样,它也具有使用通过libuv内置于底层操作系统中的代码的某些功能。 libuv和node都没有代码来处理所有这些低级网络请求操作。相反,libuv将发出的请求委派给基础操作系统。因此,真正的网络请求实际上是我们的操作系统。使用Libuv发出请求,然后仅等待操作系统发出信号,表明某些响应已返回到请求。网络I / O由系统和ISP中的网络硬件完成。OS只会跟踪连接,一旦I / O操作完成,OS会将结果传递给Libuv。