管道node.js到多个目的地的对象流产生了奇怪的结果 - 为什么?

时间:2017-10-04 16:51:32

标签: node.js stream

当将一个变换流传输到另外两个变换流时,偶尔我会从一个目标流中获取一些对象,而不是另一个目标流中的正确对象。在90,000个对象的流中,在大约1/3的运行中,从序列号约10,000开始的大约10个对象来自错误的流(异常对象的数量的起始位置变化)。世界上有什么可以解释这种奇怪的结果?

设置:

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

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

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

检查流(check1 a sink,check2 passthrough)通过check2显示流中存在异常对象,但不在流中检查check1。

文件读写是文本(csv)文件。我在Windows 7上使用的是Node.js版本8.6(虽然当之无愧,请不要为后者扔石头。)

关于如何更好地隔离问题的建议也受到欢迎。这种异常是结构化的,它看起来不像是一般的内存泄漏,但不够一致,不足以成为代码错误。我很神秘。

1 个答案:

答案 0 :(得分:0)

唉! processingStream2修改通过它的流中的对象(实际修改子对象的属性)。显然,您不能指望管道的顺序来控制流对象中的更改顺序。非常偶然地,在通过processingStream2发送源对象之后,processingStream2的输入对象通过node internals进入processingStream1。可能是引擎盖下的一些优化的一部分。

获得的经验教训:即使您认为您正在进行下游更改,也不要在输送到多个目的地时更改输入流对象。愿你永远不必艰难地学习这一课!