Node.js Node Js是否使用libuv线程池进行网络I/O

Node.js Node Js是否使用libuv线程池进行网络I/O,node.js,libuv,Node.js,Libuv,我正在学习Node.js 我在libuv官方文档中找到了此注释- libuv使用线程池使异步文件I/O操作成为可能,但网络I/O始终在单个线程、每个循环的线程中执行 我的问题是针对以下声明(来自非官方资源)—— “今天的操作系统已经为用户提供了异步接口 许多I/O任务(例如Linux上的AIO)。只要可能,libuv将使用 这些异步接口避免了线程池的使用。” --此语句适用于异步文件I/O操作,还是仅适用于网络I/O 表示如果存在文件I/O操作,则在本例中为线程 池将被强制使用,或者libuv将

我正在学习Node.js

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

libuv
使用
线程池
使
异步文件I/O
操作成为可能,但
网络I/O
始终在单个线程、每个循环的线程中执行

我的问题是针对以下声明(来自非官方资源)——

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

--此语句适用于异步
文件I/O操作
,还是仅适用于
网络I/O

  • 表示如果存在文件I/O操作,则在本例中为线程 池将被强制使用,或者libuv将使用这些异步 接口,避免使用线程池
  • Libuv是否使用线程池进行网络I/O

  • 我最近迷上了NodeJS内部以及V8、D8和libuv之类的东西。 所以,一个非常奇怪的事情是网络i/o由事件循环处理。但是
    dns.lookup()
    由libuv线程池处理

    因此,只有当您提供
    IP
    作为url时,
    http.get/http.post
    才由事件循环处理。不是主机名。 如果提供了主机名,那么它将在内部使用
    dns.lookup
    ,这将使操作由线程池处理

    参考:


    注:我仍在学习这一点,所以欢迎任何和每一次编辑

    > P>对于一些标准库函数调用,节点C++侧和LIBUV决定完全在事件循环之外进行昂贵的计算。它们产生了一个称为线程池的东西,即线程池是一系列四个线程,它们可以用于运行计算密集型任务,例如哈希函数或读取硬盘中的文件。(fs模块功能)。 使用线程池的东西只有四种:DNS查找、fs、crypto和zlib


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

    dns.lookup
    getaddrinfo
    由线程池处理。如果提供了主机名,则加密和http get post。请参阅:
    http
    始终由事件循环处理,而不管
    ip
    hostname
    。once
    dns.lookup()
    通过线程池解析,生成的
    dns.resolve
    在事件循环inturn中运行,导致http调用通过操作系统内部(如
    epoll
    kqueue
    等)异步运行