xdStreaming不是一个新概念。它在编程中一直是很常见的要求;然而,它通常被低估,没有讨论,因为它应该经常。我在看电影”源代码”(2011年),然后它突然点击我,我能够连接点。虽然这部电影是关于时间流,他们重播,以撤消一个事故在过去,它没有太大的不同的主题在这篇文章。
我会尽量保持细节简单,希望,阅读这篇文章后,你会有更好的理解它。一旦你得到流的窍门,你会看到他们在许多地方的使用,将能够利用它的力量在你的项目。
我还假设您具备 Node.js 的基本知识,如果您愿意,可以阅读我关于该主题的其他文章。让我们开始吧。
输入/输出 (I/O)
- 在计算机科学中,输入/输出或 I/O 是指数据从应用程序传输或传输到应用程序。
- 应用程序可以执行 I/O 函数的方法有多种,其中一种是Streams。
- 流 I/O: 数据表示为字节流。流可以表示不同类型的源和/或目标(例如文件、网络位置、内存阵列等)
- 流式处理不特定于节点。它是各种编程环境中共同关心的问题。让我们以一般的方式讨论它,稍后我们将看到 Node 如何解决它。
流式处理示例
在继续讨论流背后的理论和详细信息之前,让我们先看一个非常简单的示例:
方案:您希望以有效的方式将文件从 Web 服务器发送到客户端(浏览器),以便扩展到大型文件。
在这里,我们使用readFile函数,这是非阻塞,但这将读取整个文件到内存。使用流可以轻松改进此部件。请参阅下面的示例:
这可以通过多种方式进行。文件可以先通过 HTML 模板引擎进行管道处理,然后进行压缩。请记住,一般模式是可读的。
数据流
- 让我们退后一步,了解什么是流。此部分不特定于 node.js,您可以一般地应用它,此处介绍的概念与 .NET、Java 或任何其他编程语言大致相同。
- 流是可用于从存储介质(也称为备份存储)读取或写入的字节序列。
- 此介质可以是磁盘上的文件系统,可以是内存,也可以是网络套接字。因此,它是一个存储机制,保存一些数据。现在,这些数据的性质并不重要。它可以是 zip 文件、音频文件、文本文件或任何类型的数据。
- 然后,流将此数据建模,而不管其类型为一组字节,并赋予应用程序读取或写入这些字节的能力。
非流数据消耗
让我们以非流式处理的方式查看数据消耗流:
- 如果没有流式处理方法,应用程序将从数据源获取数据。
- 它唯一的选择是一次获取大部分数据。
- 应用程序必须在此数据存储在内存中,然后才能处理它。当然,随着数据规模的扩大,这对内存会产生巨大的负面影响。这将严重损害应用程序的可伸缩性。
基于流的数据消耗
现在查看基于流的数据消耗对表的带来什么:
- 一个非常重要的好处是,这种方法是应用程序可以按块使用数据。应用程序返回的是表示数据块的部分。
- 此块的大小通常根据内存容量和预期负载决定。
- 重要的是,应用程序不需要将整个数据加载到内存中。相反,只有该块存储在内存中,然后由应用程序处理。
- 然后,应用程序将询问网块,每当其准备继续处理它。这种情况一直持续到没有剩余数据块为止。
基于内存的流呢?
- 还有一些基于内存的流,其中数据来自内存。因此,问题是,如果数据已经在内存中,那么如何利用流的内存保存特性?嗯,在这种情况下,答案就是你根本不回答。
- 基于内存的流在内存中已有数据,因此此处没有优势。但是,这并不意味着不使用基于内存的流。仍然有各种各样的使用场景,其中一些我们将在以后的帖子中看到。
Node.js 中的流
好了,现在我们对流及其优点有了一般的了解,让我们看看 Node.js 中流的结构和使用情况。
- 在 Node 中,流是几个不同对象遵循的抽象接口。流可以是可读的或可写的,并且与事件发射器的实例一起实现。流提供了在对象之间创建数据流的方法。
- 事件发射器是节点大多数核心模块的基础。流、网络和文件系统驱动。可以从事件发射器继承,以制作基于事件的 API。
- 从 EventEmitter 继承的流可用于对吞吐量不可预知的数据进行建模,例如网络连接,其中数据速度可能因网络上的其他用户正在执行的操作而异
这可能是从转换成JSON的XML API数据,使得在JavaScript中更容易工作。
- 内置: 例如fs.createReadStream
- HTTP: 技术网络流,可处理各种 Web 技术。
- RPC(远程过程调用):通过网络发送流是实现进程间通信的有用方法。
流示例:字数
让我们看另一个流示例。代码是不言自明的,如果某些内容不清楚,请在评论中询问。该示例下载网页并计算特定单词的计数。