gpt4 book ai didi

node.js - 将 Node.js 对象流传输到多个目的地会产生奇怪的结果 - 为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:51 24 4
gpt4 key购买 nike

当将一个转换流通过管道传输到其他两个转换流时,有时我会从一个目标流中获取一些对象,这些对象出现在另一个目标流中的正确对象的位置。在包含 90,000 个对象的流中,大约有 3 次运行中有 1 次从序列号大约 10,000 开始的大约 10 个对象来自错误的流(异常对象数量的起始位置各不相同)。到底是什么造成了如此奇怪的结果?

设置:

sourceStream.pipe(processingStream1).pipe(check1);
processingStream1.pipe(check2).pipe(destinationStream1);
processingStream1.pipe(processingStream2).pipe(destinationStream2);

sourceStream 是由读取的文件提供的转换流。两个目标流是导致文件写入的转换流。文件读取和文件写入都是通过fs Streaming API。所有流都依赖于node.js管道中的自动背压。

偶尔,来自processingStream2 的对象会泄漏到destinationStream1 中,如上所述。

检查流(check1 是接收器,check2 是直通)显示异常对象存在于通过 check2 的流中,但不存在于进入 check1 的流中。

文件读取和写入都是文本(csv)文件。我在 Windows 7 上使用 Node.js 8.6 版(尽管这是应得的,但请不要因为后者而向我扔石头)。

也欢迎有关如何更好地隔离问题的建议。这种异常现象的结构足够好,看起来不像是一般的内存泄漏,但又不够一致,不足以构成代码错误。我很困惑。

最佳答案

呃! processingStream2 修改通过它的流中的对象(实际上修改子对象的属性)。显然,您不能指望管道的顺序来控制流对象更改的顺序。非常偶然的情况是,通过processingStream2 发送源对象后,processingStream2 的输入对象会通过 Node 内部进入processingStream1。可能是一些底层优化的一部分。

经验教训:在管道传输到多个目标时,不要更改输入流对象,即使您认为正在下游进行更改。愿您永远不必以惨痛的方式吸取这一教训!

关于node.js - 将 Node.js 对象流传输到多个目的地会产生奇怪的结果 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46570167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com