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

时间:2014-02-03 22:04:55

标签: node.js stream

我经常听说过Streams2和旧流,但什么是Streams3? It get mentioned in this talk by Thorsten Lorenz

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

在Google上进行搜索,我也在Changelog of Node 0.11.5

中看到了它
  

stream:简化流动,被动数据监听(streams3)(isaacs)

3 个答案:

答案 0 :(得分:44)

我要试一试,但我可能错了。从来没有写过Streams1(old-streams)或Streams2,我可能不是自己回答这个问题的合适人选,但现在就去了。似乎Streams1 API仍然存在一定程度。在Streams2中,有两种模式的流流动(传统)和非流动。简而言之,支持流动模式的垫片正在消失。这是message that lead to the patch now called called Streams3

  

与streams2相同的API,但删除了flow / old的混乱模式   模式切换。

     
      
  1. 每次调用read()并返回一些数据时,都会触发数据事件。
  2.   
  3. resume()会重复调用read()。否则,没有变化。
  4.   
  5. pause()会停止重复调用read()
  6.   
  7. pipe(dest)on('data', fn)将自动调用resume()
  8.   
  9. 没有切换到旧模式。只有流动,暂停了。 Streams开始暂停。
  10.   

不幸的是,为了理解Streams3定义的任何描述,你需要先了解Streams1和遗留流

背景故事

首先,让我们来看看Node v0.10.25文档对这两种模式的看法,

  

可读流有两种“模式”:流动模式和非流动模式。在流动模式下,数据从底层系统读取并尽快提供给您的程序。在非流动模式下,您必须显式调用stream.read()以获取数据块。 - Node v0.10.25 Docs

Isaac Z. Schlueter said in November slides I dug up

  

streams2

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

因此,似乎在streams1中,您创建了一个对象并向该对象调用.on('data', cb)。这会将事件设置为触发器,然后您受到流的支配。在Streams2中,内部流有缓冲区,您可以显式地从这些流中请求数据(使用`.read)。 Isaac继续指定如何在Streams2中进行向后兼作以保持Streams1(旧流)模块正常运行

  

old-mode streams1 shim

     
      
  • 新流可以切换到旧模式,在那里他们会发出'数据'
  •   
  • 如果添加'data'事件处理程序,或调用pause()或resume(),则切换
  •   
  • 对现有测试进行微小更改以保持诚实
  •   

因此,在Streams2中,对.pause().resume()的调用会触发填充程序。它应该,对吧?在Streams2中,您可以控制何时到.read(),并且您没有捕捉被抛出的东西。这触发了一种独立于Streams2的传统模式。

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

createServer(function(q,s) {
  // ADVISORY only!
  q.pause()
  session(q, function(ses) {
    q.on('data', handler)
    q.resume()
  })
})
  • 在Streams1中,q立即开始阅读和发布(可能会丢失数据),直到调用q.pause建议q停止提取数据但不会将事件发送到明确它已经阅读的内容。
  • 在Streams2中,q开始暂停,直到调用.pause(),表示模拟旧模式。
  • 在Streams3中,q开始时暂停,因为从未从文件句柄中读取q.pause()一个noop,并且在调用q.on('data', cb)时会调用q.resume直到缓冲区中没有更多数据。然后,再次调用q.resume做同样的事情。

答案 1 :(得分:6)

似乎在io.js中引入了Streams3,然后在Node 0.11 +

中引入

Streams 1支持的数据被推送到流中。没有消费者控制,无论消费者是否准备好,都会向消费者投掷数据。

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

Streams 3允许在同一个流上提取和推送数据。

这里有很棒的概述:

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

答案 2 :(得分:-4)

我建议你阅读文档,更具体地说是阅读流消费者的#34; API,它实际上是非常容易理解的,除了我认为其他答案是错误的:http://nodejs.org/api/stream.html#stream_readable_read_size < / p>