可读的高水印有用性

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机器将在每个块写入后进行检查,如果你实际到达highWaterMarkthis.push(chunk)将返回false,你的流将根据需要使用尽可能少的内存,并且还将以合理的速率保持流动。

记住你正在编写的实现可以以流式方式读取,它将通过管道传输到可写流。 highWarerMark确保流不断流动,并且用于保持该状态的存储器被有效使用。

以上是关于可读的高水印有用性的主要内容,如果未能解决你的问题,请参考以下文章

Django Celery 结果将任务 ID 设置为人类可读的内容?

如何使用 perf 收集一些可读的堆栈跟踪?

代码质量第 3 层 - 可读的代码

给定背景颜色,如何获得使其在背景颜色上可读的前景色?

在解析错误时中止并显示有用的消息

人类可读的 GUID