我正在学习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
适用?
答案 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。