当将一个变换流传输到另外两个变换流时,偶尔我会从一个目标流中获取一些对象,而不是另一个目标流中的正确对象。在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(虽然当之无愧,请不要为后者扔石头。)
关于如何更好地隔离问题的建议也受到欢迎。这种异常是结构化的,它看起来不像是一般的内存泄漏,但不够一致,不足以成为代码错误。我很神秘。
答案 0 :(得分:0)
唉! processingStream2修改通过它的流中的对象(实际修改子对象的属性)。显然,您不能指望管道的顺序来控制流对象中的更改顺序。非常偶然地,在通过processingStream2发送源对象之后,processingStream2的输入对象通过node internals进入processingStream1。可能是引擎盖下的一些优化的一部分。
获得的经验教训:即使您认为您正在进行下游更改,也不要在输送到多个目的地时更改输入流对象。愿你永远不必艰难地学习这一课!