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 流有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
react-native 捆绑失败:错误:找不到模块 /metro-react-native-babel-transformer/src/index.js