在转换流中实现背压

时间:2019-07-31 08:24:23

标签: node.js stream stdin nodejs-stream

我正在阅读以下文档: https://nodejs.org/ja/docs/guides/backpressuring-in-streams/

它说:

Readable.pipe(Transformable).pipe(Writable);
  

“背压将自动应用,但请注意,   转换流的传入和传出highWaterMark可能是   被操纵,将影响背压系统。”

我可以这样更改highWaterMark

export class JSONParser extends stream.Transform {

  constructor() {
    super({objectMode: true, highWaterMark: 3}); // 3 objects is high water mark
  }

}

但是由于它说转换流的传入和传出highWaterMark都可以被操纵-如何更改传入/传出数据的highWaterMark?我的猜测是,这一个属性可以同时控制两个级别?

本质上,我试图减慢流中的读取量,以便可以处理其他I / O。在我的情况下,可读流为process.stdin,并且process.stdin被管道传输到我控制的转换流。如何降低从stdin读取的速度?

1 个答案:

答案 0 :(得分:0)

对于双工流(或从双工继承的转换流),可以将readableHighWaterMarkwritableHighWaterMark都设置为选项。您的示例将变为:

export class JSONParser extends stream.Transform {

    constructor() {
        super({objectMode: true, readableHighWaterMark: 5, writableHighWaterMark: 3}); // 5 on the readable side, 3 on the writable
    }
}

请注意,如果设置了highWaterMark,它将覆盖readableHighWaterMarkwritableHighWaterMark(来源:https://github.com/nodejs/node/blob/864860e9f3d4eed0b0b81af55197d7e525ea6306/lib/internal/streams/state.js)。