NodeJS:双工流和转换流有什么区别?

45
流文档中指出,Duplex 流是"实现可读和可写接口的流",Transform 流是"输出从输入中计算得到的 Duplex 流。"不幸的是,文档没有描述 Transform 流提供了什么高于 Duplex 流的功能。
在这两者之间有区别吗?你应该何时使用它们?
4个回答

103

双工流可以被认为是一个可读流和一个可写流的组合。两个流是独立的,各自拥有独立的内部缓冲区。读事件和写事件是独立发生的。

                             Duplex Stream
                          ------------------|
                    Read  <-----               External Source
            You           ------------------|   
                    Write ----->               External Sink
                          ------------------|
            You don't get what you write. It is sent to another source.

转换流是一种双工流,其中读取和写入以因果方式进行。双工流的端点通过某些转换相互链接。读取需要写入已发生。

                                 Transform Stream
                           --------------|--------------
            You     Write  ---->                   ---->  Read  You
                           --------------|--------------
            You write something, it is transformed, then you read something.

1
我想我明白了!Transform Streams 必须实现 _transform 方法,该方法与 Writeable Stream 的 _write 方法具有相同的签名,因此这意味着所读取的内容取决于所写入的内容。其中一个影响是您无法像 _read 一样指定要读取的字节数,它只是您写入的字节数。另一方面,对于 Duplex 流,理论上可以创建一个依赖于 _write_read,或者甚至让 _write 依赖于 _read,但 Duplex Stream 类本身并不意味着读/写链接。 - brainkim
15
赞成ASCII图表,它们应该在Node.js文档中使用,这将有助于更好地传达概念。 - David Chase
按照您的定义,一个转换流应该只生成一个转换后的输出,所以假设我有100万个OHLC数据通过流实时传输,并且我想从中生成5m、15m等等,我每个转换流实例只会进行1次转换,或者将所有时间框架从单个输入推送被认为是良好的实践? - PirateApp
这两种类型的流不是以相同的方式实现的吗?只是以不同的方法呈现给我们开发者(双工使用写和读,转换使用转换流)。 - Marcos Pereira

10
区别只在于语法糖。转换流是全双工流,但不像实现_write_read方法那样,您只需实现_transform方法即可。您可以在优秀的substack流指南Isaacs的可读流库中了解更多有关流的信息。

4
根据文档:

Duplex - 可读写的流(例如,net.Socket)。

Transform - Duplex 流可以在写入和读取数据时修改或转换数据(例如,zlib.createDeflate())。

简单来说:


2

如果你阅读文档中的流实现者API部分,它们说明Duplex和Transform流的一些可能用例分别是“读取和写入”以及“对已写入数据进行操作,然后读取结果”。

简单来说,Transform流允许你实现_transform方法,该方法接受一些输入并在数据上执行某些操作后返回输出,可用于诸如压缩或哈希等任务,而Duplex流可用于像TCP套接字连接这样的任务,其中你只需发送和接收数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接