转换流暂停时会发生什么?

时间:2020-07-25 00:47:16

标签: node.js stream

如果您将流式可读流传输到Transform流(例如stream.PassThrough)中,那么如果暂停双工流会怎样?它也会暂停原始可读流吗?如果不是,来自可读流的流数据是否“泄漏”?还是数据积累在程序存储器中的某个地方?

编辑显然,可读流确实应该暂停。但是,暂停之前似乎有延迟。 在副本中:

Welcome to Node.js v14.5.0.
Type ".help" for more information.
> const fs = require('fs');
undefined
> const stream = require('stream');
undefined
> const transform = new stream.PassThrough();
undefined
> const readable = fs.createReadStream('yes.jpg');
undefined
> readable.readableFlowing;
null
> readable.on('data', console.log);
  console.log(readable.readableFlowing);
  console.log(readable.isPaused());
  readable.pipe(transform);
  console.log(readable.readableFlowing);
  console.log(readable.isPaused());
true
false
true
false
undefined
> <Buffer ff d8 ff e1 00 22 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 01 01 12 00 03 00 00 00 01 00 01 00 00 00 00 00 00 ff db 00 43 00 02 01 01 02 01 01 02 ... 65486 more bytes>
<Buffer f2 5b ab 7d ff 00 bd 5c 15 6a 46 99 b4 70 bc de fc 4f 9c 2e 63 b7 d6 13 6c 2a ab 54 74 7b 35 d2 f5 56 5b 85 5f f8 15 49 6d a7 c9 e1 f7 89 a6 68 b6 a3 ... 65486 more bytes>
> readable.isPaused();
true
> readable.readableEnded;
false

1 个答案:

答案 0 :(得分:0)

如果暂停双工流会发生什么?它也会暂停原始可读流吗?

是的,它将暂停链中的所有其他流。当流通过管道传输到一起或经过适当实现的转换时,它们将实现流控制,因此没有人被迫缓冲比他们想要的更多的缓冲区。这是使用管道/转换流的好功能之一(它们会自动执行流控制)。

但是,.pipe()所做的只是注册一些事件处理程序。在您的代码块完成语句执行并返回事件循环之前,这些事件处理程序实际上不会获得任何事件。因此,以readable.on()开头的大型代码块将完整运行,然后再发生从readaonble.on('data', ...)readable.pipe()开始的任何事件。