解释 Node.js 中的非阻塞 I/O 概念

2025年2月26日 | 4 分钟阅读

随着 Node.js 的发布,基于 Chrome V8 引擎的稳定 JavaScript 运行时,可扩展网络应用的开发变得越来越流行。非阻塞 I/O 模型的主要优势在于其改进的可扩展性。

非阻塞方法采用异步方法。异步程序的逐行执行并不总是得到保证。应用程序会继续执行下一项任务,而不是等待函数返回后再继续。

为了防止在等待输入输出操作完成时其他操作被暂停,非阻塞 I/O 会管理这些任务。管理多个输入/输出任务(如读取文件、响应网络查询或与数据库交互)对于应用程序尤其重要。

Node.js 中的非阻塞 I/O 是什么?

非阻塞 I/O 使程序在处理 I/O 操作时能够执行其他任务。当进程完成时,会调用一个事件处理函数来处理结果。通过减少空闲等待时间,这种策略可以提高性能和资源利用率。

示例 1

让我们举一个例子来说明 Node.js 中**非阻塞 I/O** 方法。

输出

 
Product: 120   

说明

在非阻塞 I/O 程序中,产品会在文件内容之前打印。当应用程序继续执行下一步而无需等待 readFile() 函数完成时,就会发生这种情况。如果 readFile() 函数返回,内容也会被打印。

  • 使用 fs.readFile 函数,代码在没有任何延迟的情况下读取 example.txt 的内容。
  • 如果在读取操作期间发生错误,会记录一条日志条目。
  • 然而,文件的内容被记录下来了。

如何计算数字的乘积

  • 该代码将 1 到 5 的数字相乘。
  • 一个初始化为 1 的变量 product 在循环中乘以每个数字。
  • 最后,它会记录计算出的乘积。

示例 2

让我们举另一个例子来说明 Node.js 中**非阻塞 I/O** 方法。

输出

 
Average: 5.5   

说明

  • 在此示例中,代码使用 fs.readFile 函数以非阻塞方式读取 code.csv 中数据的*.content。*
  • 如果读取操作失败,它会记录一条错误消息并从回调函数返回。
  • 成功读取文件后,内容将被分成行,然后用逗号分隔以处理 CSV 数据。
  • 最后,将处理过的 CSV 数据记录下来。

计算一组数字的平均值

  • 代码定义了一个包含 1 到 10 的数字的数组。
  • 接下来,它使用 reduce 方法计算这些数字的总和。
  • 通过将总和除以数组中的元素总数来找到平均值。
  • 最后,记录计算出的平均值。

结论

总之,非阻塞 I/O 是 Node.js 的一项基本功能,它允许 Node.js 在不因 I/O 等待时间而受限的情况下处理多个并发任务,例如读取文件或响应网络请求。由于 Node.js 采用异步方法,应用程序的性能得到了显著提升,响应速度更快,从而使主执行线程可以处理其他任务。提供的示例突显了 Node.js 即使在高负载下也能保持效率和可扩展性的能力。本文演示了其非阻塞 I/O 如何与同步代码一起实现无缝的 I/O 操作执行。从传统的阻塞 I/O 模型转向 Node.js 是该框架在现代 Web 应用开发中得到广泛应用的主要原因之一。