Node.js Node Js是否使用libuv线程池进行网络I/O
我正在学习Node.js 我在libuv官方文档中找到了此注释-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将
libuv
使用线程池
使异步文件I/O
操作成为可能,但网络I/O
始终在单个线程、每个循环的线程中执行
我的问题是针对以下声明(来自非官方资源)——
“今天的操作系统已经为用户提供了异步接口
许多I/O任务(例如Linux上的AIO)。只要可能,libuv将使用
这些异步接口避免了线程池的使用。”
--此语句适用于异步文件I/O操作
,还是仅适用于网络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
。oncedns.lookup()
通过线程池解析,生成的dns.resolve
在事件循环inturn中运行,导致http调用通过操作系统内部(如epoll
,kqueue
等)异步运行