可读的高水印有用性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可读的高水印有用性相关的知识,希望对你有一定的参考价值。
如果我们不在highWaterMark
方法中处理它,_read()
在实现可读流时是否有实用程序?
如果我理解正确的话,程序员可以自行决定停止阅读,如果他不这样做,什么都不会扼杀它(甚至不是pipe
)。
TL; DR:是的,但这不是你需要担心的事情。 :)
你是对的,highWaterMark对实际阅读(或生成数据)没有任何影响,但它确实对Readable.._read
有直接影响,或者它影响你从Readable..push
获得的信息。所以,尽管你不需要,你不应该在你的_read
实现中包含任何基于它的逻辑 - 它确实有一个实用程序。
为了解释让我们从Readable.._read上的文档开始 - 当流数据低于_read
时,理想情况下会在达到需要发出_highWaterMark
事件的点之前调用drain
。每当调用该方法时,它都会在实现调用push
方法之前阻止进一步的调用。
所以你说的是,没有什么能阻止你编写这个实现:
_read(sizeRequired) {
const x = readLotsOfChunksDisregardingSizeRequired();
x.forEach(chunk => this.push(chunk);
}
当然,这是真的,在某些情况下,如果你无法真正控制读取,那么它是可以接受的。然而,_highWaterMark
也用于为您提供push
方法的快速反馈信息。
因此,如果我们考虑另一个可以控制源的实现:
_read(numRequired) {
while (true) { // I know, I know don't write while true's...
const chunk = readASingleChunk();
if (!this.push(chunk))
return;
}
}
在这种情况下,_highWaterMark
机器将在每个块写入后进行检查,如果你实际到达highWaterMark
,this.push(chunk)
将返回false
,你的流将根据需要使用尽可能少的内存,并且还将以合理的速率保持流动。
记住你正在编写的实现可以以流式方式读取,它将通过管道传输到可写流。 highWarerMark
确保流不断流动,并且用于保持该状态的存储器被有效使用。
以上是关于可读的高水印有用性的主要内容,如果未能解决你的问题,请参考以下文章