node.js - Node Js 是否使用 libuv 线程池进行网络 I/O
问题描述
我在学习Node.js
我在 libuv 官方文档中找到了这个注释-
“libuv
使用 athread pool
使asynchronous file I/O
操作成为可能,但network I/O
始终在单个线程中执行,即每个循环的线程。”</p>
我的问题是针对以下声明(来自非官方资源)-
“今天的操作系统已经为许多 I/O 任务(例如 Linux 上的 AIO)提供了异步接口。只要有可能,libuv 将使用这些异步接口,避免使用线程池。”
- 该声明是适用于异步file I/O operations
还是仅适用于Network I/O
?
- 意味着如果有文件 I/O 操作,那么在这种情况下将强制使用线程池或 libuv 将使用那些异步接口,避免使用线程池?
- Libuv 是否为网络 I/O 使用线程池?
解决方案
对于一些标准库函数调用,节点 C++ 端和 libuv 决定完全在事件循环之外进行昂贵的计算。他们制作了称为线程池的东西,线程池是一系列四个线程,可用于运行计算密集型任务例如散列函数或读取硬盘中的文件(fs 模块函数)。只有四样东西使用线程池——DNS 查找、fs、crypto 和 zlib。
因此,正如 node 标准库有一些使用 libuv 线程池的函数一样,它也有一些使用通过 libuv 内置到底层操作系统中的代码的函数。libuv 和 node 都没有任何代码来处理所有这些低级网络请求操作。相反,libuv 将请求委托给底层操作系统。所以实际上是我们的操作系统来处理真正的网络请求。Libuv 用于发出请求,然后它只是等待操作系统发出信号,表明某些响应已返回到请求。网络 I/O 由系统中的网络硬件完成,ISP.OS 只是跟踪连接,一旦 I/O 操作完成,操作系统会将结果传递给 Libuv。
推荐阅读
- laravel - 如何在 laravel 中正确实现 CRUD json 字段
- angular - 我需要根据用户选择有条件地渲染一个角度组件
- javascript - Jest helper-module-transforms 无法读取未定义的属性“值”
- android - 解决 Android API 29+ 上 EnterText 问题的扩展方法
- sql - 使用子查询的笛卡尔积的 SQL 比较报告
- python - 在 Parquet 中使用 Dask 日期/时间戳列存储
- google-sheets-formula - 如何为更新添加数组公式
- firebase - 使用 Google/Apple 等注册后使用电子邮件登录 Firebase
- vue-cli - 导入全局变量 stylus vue-cli
- javascript - JavaScript 查看单词是否包含有序的增加/减少字符并重复