xdStreaming不是一个新概念。它在编程中一直是很常见的要求;然而,它通常被低估,没有讨论,因为它应该经常。我在看电影”源代码”(2011年),然后它突然点击我,我能够连接点。虽然这部电影是关于时间流,他们重播,以撤消一个事故在过去,它没有太大的不同的主题在这篇文章。

我会尽量保持细节简单,希望,阅读这篇文章后,你会有更好的理解它。一旦你得到流的窍门,你会看到他们在许多地方的使用,将能够利用它的力量在你的项目。

我还假设您具备 Node.js 的基本知识,如果您愿意,可以阅读我关于该主题的其他文章。让我们开始吧。

输入/输出 (I/O)

  • 在计算机科学中,输入/输出或 I/O 是指数据从应用程序传输或传输到应用程序。
  • 应用程序可以执行 I/O 函数的方法有多种,其中一种是Streams。
  • 流 I/O: 数据表示为字节流。流可以表示不同类型的源和/或目标(例如文件、网络位置、内存阵列等)
  • 流式处理不特定于节点。它是各种编程环境中共同关心的问题。让我们以一般的方式讨论它,稍后我们将看到 Node 如何解决它。

流式处理示例

在继续讨论流背后的理论和详细信息之前,让我们先看一个非常简单的示例:

方案您希望以有效的方式将文件从 Web 服务器发送到客户端(浏览器),以便扩展到大型文件。

code snippet

在这里,我们使用readFile函数,这是非阻塞,但这将读取整个文件到内存。使用流可以轻松改进此部件。请参阅下面的示例:

code snippet

这可以通过多种方式进行。文件可以先通过 HTML 模板引擎进行管道处理,然后进行压缩。请记住,一般模式是可读的。

数据流

  • 让我们退后一步,了解什么是流。此部分不特定于 node.js,您可以一般地应用它,此处介绍的概念与 .NET、Java 或任何其他编程语言大致相同。
  • 流是可用于从存储介质(也称为备份存储)读取或写入的字节序列。
  • 此介质可以是磁盘上的文件系统,可以是内存,也可以是网络套接字。因此,它是一个存储机制,保存一些数据。现在,这些数据的性质并不重要。它可以是 zip 文件、音频文件、文本文件或任何类型的数据。
  • 然后,流将此数据建模,而不管其类型为一组字节,并赋予应用程序读取或写入这些字节的能力。

streaming data store

非流数据消耗

让我们以非流式处理的方式查看数据消耗流:

application data store

  • 如果没有流式处理方法,应用程序将从数据源获取数据。
  • 它唯一的选择是一次获取大部分数据。
  • 应用程序必须在此数据存储在内存中,然后才能处理它。当然,随着数据规模的扩大,这对内存会产生巨大的负面影响。这将严重损害应用程序的可伸缩性。

基于流的数据消耗

现在查看基于流的数据消耗对表的带来什么:

application data store

  • 一个非常重要的好处是,这种方法是应用程序可以按块使用数据。应用程序返回的是表示数据块的部分。
  • 此块的大小通常根据内存容量和预期负载决定。
  • 重要的是,应用程序不需要将整个数据加载到内存中。相反,只有该块存储在内存中,然后由应用程序处理。
  • 然后,应用程序将询问网块,每当其准备继续处理它。这种情况一直持续到没有剩余数据块为止。

基于内存的流呢?

  • 还有一些基于内存的流,其中数据来自内存。因此,问题是,如果数据已经在内存中,那么如何利用流的内存保存特性?嗯,在这种情况下,答案就是你根本不回答。
  • 基于内存的流在内存中已有数据,因此此处没有优势。但是,这并不意味着不使用基于内存的流。仍然有各种各样的使用场景,其中一些我们将在以后的帖子中看到。

Node.js 中的流

好了,现在我们对流及其优点有了一般的了解,让我们看看 Node.js 中流的结构和使用情况。

  • 在 Node 中,流是几个不同对象遵循的抽象接口。流可以是可读的或可写的,并且与事件发射器的实例一起实现。流提供了在对象之间创建数据流的方法。
  • 事件发射器是节点大多数核心模块的基础。、网络和文件系统驱动。可以从事件发射器继承,以制作基于事件的 API。
  • 从 EventEmitter 继承的流可用于对吞吐量不可预知的数据进行建模,例如网络连接,其中数据速度可能因网络上的其他用户正在执行的操作而异

这可能是从转换成JSON的XML API数据,使得在JavaScript中更容易工作。

  • 你可能会认为事件和流听起来是抽象的,虽然这是真的,但有趣的是,它们被用作I/O模块的基础,如fsnet。
  • 流的类型
    • 内置: 例如fs.createReadStream
    • HTTP: 技术网络流,可处理各种 Web 技术。
    • RPC(远程过程调用):通过网络发送流是实现进程间通信的有用方法。
  • 当需要组合时,使用流实现的协议可能很方便。考虑如果数据可以通过gzip模块传递数据,只需对管道进行一次调用,那么向网络协议添加数据压缩是多么容易。
  • 同样,流数据可以更高效地处理大型结果集的数据库库;可以一次流式传输单个项,而不是将所有结果收集到数组中。
  • 您还可以在线找到流的创造性用途。用于生成音频流的 baudio 模块。
  • 流示例:字数

    让我们看另一个流示例。代码是不言自明的,如果某些内容不清楚,请在评论中询问。该示例下载网页并计算特定单词的计数。

    countstream

    count stream demo

    node-start

    Related Posts:

    Comments are closed.