Node.js 中 I/O 密集型的含义是什么

2024-04-14

我正在学习 Node.js,还发现 Node.js 最适合用于 I/O 密集型任务,这让我有点困惑。因此,经过一些研究,我发现了这样的说法:“读取和/或写入大量数据的应用程序”。那么,这是否意味着 Node.js 最好与数据一起使用,即读取大数据,从中获取必要的数据并将其发送回客户端?


Nodejs 应用程序的架构可以很好地包含非 I/O 事物,并且不仅仅适合大数据应用程序(事实上大数据与之完全无关)。

当您的应用程序不是 CPU 密集型而是花费大部分时间执行 I/O(输入/输出)任务(例如读/写数据库、从文件读/写)时,Node.js 的默认、简单实现表现最佳。读取/发送网络数据等。这与大数据无关,而是与服务器大部分时间都在做什么有关。

令人惊讶的是(对某些人来说),由于 Web 服务器的主要工作是响应 HTTP 请求(通常是数据请求),因此大多数 Web 服务器将大部分时间花在获取内容、读写内容以及发送内容上,这些都是 I/O 任务。在 Node.js 设计中,所有这些 I/O 任务都以非阻塞方式异步发生,并且它们使用事件在这些操作完成时发出信号。这就是描述 Node.js 时“事件驱动设计”一词的由来。碰巧这使得 Node.js 在处理主要涉及 I/O 的事情上非常高效。这是 Node.js 的简单实现最擅长的事情。而且,它通常比纯线程服务器设计做得更好,纯线程服务器设计将操作系统线程专用于每个当前正在进行的 I/O 操作(许多服务器框架的原始设计)。

如果你确实有 CPU 密集型的事情(主要计算、图像处理、繁重的加密操作等),并且你经常做这些事情或者它们花费很长时间,那么如果你把这些任务放在工作线程中,你会得到最好的服务或者在另一个进程中,并在 Node.js 中的主进程和该工作进程之间来回通信,以完成 CPU 密集型工作。过去,node.js 没有工作线程,这使得这项任务变得更加复杂,您经常必须使用一个或多个附加进程(通过集群或附加专用进程)来处理这种 CPU 密集型任务工作,但现在您可以使用工作线程,这会更方便一些。

例如,我有一个需要大量加密的服务器任务(执行十亿次加密操作)。如果我将其放在主 Node.js 线程中,这实际上会阻止事件循环,因此我的服务器在运行重型加密操作时无法处理其他请求,这会破坏服务器的响应能力。

但是,我能够将加密工作转移到一个工作线程(实际上是几个工作线程),然后可以在我的主线程保持良好和活跃的情况下处理加密工作,以便及时处理其他不相关的传入请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中 I/O 密集型的含义是什么 的相关文章

随机推荐