NodeJS:Duplex 流和 Transform 流有啥区别?

Posted

技术标签:

【中文标题】NodeJS:Duplex 流和 Transform 流有啥区别?【英文标题】:NodeJS: What's the difference between a Duplex stream and a Transform stream?NodeJS:Duplex 流和 Transform 流有什么区别? 【发布时间】:2013-08-22 12:44:13 【问题描述】:

Stream docs 声明 Duplex Streams“是实现 Readable 和 Writable 接口的流”和 Transform Streams“是双工流,其中输出以某种方式从输入计算。”不幸的是,文档没有描述 Transform 流在 Duplex 流之外提供什么。

这两者有什么不同吗?您什么时候会使用其中一个?

【问题讨论】:

【参考方案1】:

According to the docs:

双工 - 可读可写的流(例如 net.Socket)。

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

简单来说:

可以读取和写入双工流,但输入和输出之间不一定有任何连接。 也可以读取和写入转换流,但输出始终是其输入转换的结果。 Transform streams are Duplex streams where the output is in some way related to the input.

【讨论】:

我不确定这个答案是否能对已接受的答案提供任何清晰或洞察力。 接受的答案对我来说似乎根本不清楚。【参考方案2】:

区别只是语法糖。转换流是全双工流,但不是实现_write_read 方法,而是要求您只实现_transform 方法。您可以在优秀的substack's streams guide 或Isaacs's readable-stream repo 上阅读有关流的更多信息。

【讨论】:

【参考方案3】:

双工流可以被认为是一个可读流和一个可写流。两者都是独立的,并且每个都有单独的内部缓冲区。读取和写入事件独立发生。

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

Transform 流是一种双工,其中读取和写入以因果方式发生。双工流的端点通过某种变换链接。读需要写。

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

【讨论】:

我想我明白了!转换流必须实现_transform 方法,该方法与可写流的_write 方法具有相同的签名,因此这意味着读取的内容取决于写入的内容。这意味着您不能像_read 那样指定一次读取的字节数,它只是您写入的字节数。另一方面,对于双工流,理论上您可以创建一个依赖于_write_read,或者甚至拥有一个依赖于_read_write,但不能读/写Duplex Stream 类本身隐含了链接。 +1 用于 ascii 图,它们应该在 node.js 文档中使用,这将有助于更好地传达概念 赞成,因此根据您的定义,单个转换流应该只生成一个转换后的输出,所以假设我有 1m ohlc 数据通过流实时传输,我想从中生成 5m 15m 等,我每个转换流实例只会进行 1 次转换,还是认为从单个输入推送所有时间帧是一种好习惯? 这两种类型的流不是以相同的方式实现的,只是用不同的方法呈现给我们开发人员吗? (双工读写,变换流变换)【参考方案4】:

如果您阅读文档的 API for stream implementors 部分,他们会指出 Duplex 和 Transform 流的一些可能用例分别是“读取和写入”和“对写入的数据进行操作,然后读取结果”。

简单地说,Transform 流可以让您实现_transform 方法,该方法接受一些输入并在对数据进行一些操作后返回输出,并可用于压缩或散列等操作,而 Duplex 流可以用于诸如 TCP 套接字连接之类的东西,您只需在其中发送和接收数据。

【讨论】:

以上是关于NodeJS:Duplex 流和 Transform 流有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs学习笔记----- Stream

nodejs-Sream

如何使用节点 js 流和 HTML 表单上传文件?

Firestore 查询流和获取之间的区别?

react-native 捆绑失败:错误:找不到模块 /metro-react-native-babel-transformer/src/index.js

2D转换下的zoom和transfor:scale的区别