gpt4 book ai didi

javascript - 当输入流通过管道传输到多个输出流时,缓冲区级别会发生什么?

转载 作者:搜寻专家 更新时间:2023-10-31 23:39:41 25 4
gpt4 key购买 nike

我正在阅读流文档并在 https://nodejs.org/api/stream.html#stream_buffering 寻找关于流的缓冲行为描述。

该文档似乎没有提到当管道传输到多个输出时 inputStream 缓冲区(或多个缓冲区?)会发生什么,因为不同的输出具有不同的消耗速度:

当管道多个输出时,readableStream 是否为每个输出保留专用缓冲区?

消费时输出是保持相同的速度还是更快的会更早结束?

const input = fs.createReadStream('img.jpg');
const target1 = input.pipe(fs.createWriteStream('target1.jpg'));
const target2 = input.pipe(fs.createWriteStream('target2.jpg'));

最佳答案

TL;DR:简短的回答是 - 较慢的目标流控制流速。

所以首先让我们看看读取端会发生什么。

const input = fs.createReadStream('img.jpg');

当您实例化输入流时,它以暂停模式创建并计划读取(没有同步完成读取,因此它还不会访问文件)。流的 highWaterMark 设置为类似 16384 的值,当前缓冲区为 0 字节。

const target1 = input.pipe(fs.createWriteStream('target1.jpg'));
const target2 = input.pipe(fs.createWriteStream('target2.jpg'));

现在,当您实际将其通过管道传输到可写流时,通过在 pipe method implementation - see the source 中添加 on('data') 事件处理程序来设置流动模式。 .

当这完成后,我假设没有更多的程序要运行,所以 Node 开始实际读取并在上面的处理程序中运行计划的代码,它只是写入通过的任何数据。

当任何目标要写入的数据多于其 highWaterMark 时,就会发生流量控制,这会导致 write 操作返回 false。然后阅读由 calling pause here in the code 停止.上面两行你会看到 state.awaitDrain 增加了。

现在读取流再次暂停并且可写流正在将字节写入磁盘 - 在某个时候缓冲区水平再次低于highWaterMark。此时会触发 drain 事件 executes this line并且,在所有等待的排水管被调用后,恢复流程。这是通过检查递减的 awaitDrain 属性是否已达到零来完成的,这意味着所有等待的耗尽事件都已被调用。

在上述情况下,两个流中较快的一个在写入时可能会返回一个假值,但它肯定会像第一个一样耗尽。如果不是 awaitDrain,更快的流将恢复数据流,这可能会导致两者中较慢的缓冲区溢出。

关于javascript - 当输入流通过管道传输到多个输出流时,缓冲区级别会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55113708/

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