stream-Node.js中的Streams3是什么,它与Streams2有何不同?

我经常听说Streams2和旧流,但是Streams3是什么? 托尔斯滕·洛伦兹(Thorsten Lorenz)在本次演讲中提到了这一点。

我在哪里可以读到它,Streams2和Streams3有什么区别。

在Google上进行搜索时,我还看到它在Node 0.11.5的Changelog中提到,

流:简化流式,被动数据侦听(流3)(isaacs)

Evan Carroll asked 2020-02-04T10:20:26Z
3个解决方案
45 votes

我要试一试,但是我可能错了。 从未编写过Streams1(旧流)或Streams2,所以我可能不是正确回答这个问题的合适人选,但这确实可行。 似乎有Streams1 API仍在某种程度上持续存在。 在Streams2中,有两种模式的流(传统)流和非流。 简而言之,支持流动模式的垫片将消失。 这是导致现在称为Streams3的补丁的消息,

与stream2相同的API,但消除了令人困惑的流动/旧模式   模式开关。

  1. 每次调用q并返回一些数据时,都会触发数据事件。
  2. q将使其反复调用read()。 否则,没有变化。
  3. q将使其停止重复调用q.pause()
  4. qq.pause()将自动呼叫q.on('data', cb)
  5. 没有切换到旧模式。 只有人流了,停了下来。 流开始暂停。

不幸的是,要理解任何能够很好地定义Streams3的描述,您首先需要了解Streams1和旧版流。

背景故事

首先,让我们看一下Node v0.10.25文档对这两种模式的评价,

可读流具有两个“模式”:流动模式和非流动模式。 处于流动模式时,将从底层系统读取数据,并尽快将其提供给您的程序。 在非流动模式下,必须显式调用stream.read()才能获取大块数据。 —节点v0.10.25文档

Isaac Z. Schlueter在十一月份的幻灯片中说过:

流2

  • “ streams流”
  • 而不是喷出“数据”事件,而是调用read()从源中提取数据
  • 解决所有问题(我们知道)

因此,似乎在streams1中,您将创建一个对象并对该对象调用q。 这会将事件设置为触发,然后您将受到流的摆布。 在Streams2内部,流具有缓冲区,您可以明确地从这些流中请求数据(使用`.read)。 Isaac继续指定在Streams2中向后兼容的工作方式,以保持Streams1(旧流)模块正常运行

旧模式流1匀场

  • 新的流可以切换到旧模式,在那里它们喷出“数据”
  • 如果添加“数据”事件处理程序,或调用pause()或resume(),则切换
  • 对现有测试进行最小的更改以使我们保持诚实

因此,在Streams2中,对qq.pause()的调用会触发填充程序。 而且,应该吧? 在Streams2中,您可以控制何时进行q.on('data', cb),并且不会捕获被扔给您的东西。 这触发了独立于Streams2的旧模式。

让我们以艾萨克的幻灯片为例,

createServer(function(q,s) {
  // ADVISORY only!
  q.pause()
  session(q, function(ses) {
    q.on('data', handler)
    q.resume()
  })
})
  • 在Streams1中,q立即启动以读取和发出数据(可能丢失数据),直到对q.pause()的调用建议q.on('data', cb)停止提取数据,但不要发出事件以清除已读取的内容。
  • 在Streams2中,q开始暂停,直到对q.pause()的调用表示模拟旧模式为止。
  • 在Streams3中,q从未暂停从文件句柄开始读取,从而暂停了它,从而使q.pause()成为noop,并且在调用q.on('data', cb)时将调用q.resume,直到缓冲区中没有更多数据为止。 并且,然后再次致电q.resume做同样的事情。
Evan Carroll answered 2020-02-04T10:22:32Z
6 votes

好像Streams3是在io.js中引入的,然后在Node 0.11+中引入了

流1支持的数据被推送到流中。 没有消费者控制,无论数据准备好与否,都会将数据扔给消费者。

流2允许按照流1将数据推送到流,或让使用者根据需要从流中提取数据。 使用者可以在拉模式下控制数据流(在收到可用数据通知时使用stream.read())。 流不能同时支持推和拉。

流3允许在同一流上拉入和推入数据。

这里很棒的概述:

[https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/]

Joe answered 2020-02-04T10:23:15Z
-4 votes

我建议您阅读文档,尤其是“面向流消费者的API”部分,它实际上是很容易理解的,除了我认为另一个答案是错误的:[http://nodejs.org/api/stream.html#stream_visible_read_size]

Pablote answered 2020-02-04T10:23:35Z
translate from https://stackoverflow.com:/questions/21538812/what-is-streams3-in-node-js-and-how-does-it-differ-from-streams2