具有多个“数据”事件处理程序和竞争条件的 NodeJS 流

NodeJS stream with multiple 'data' event handler and race condition

本文关键字:竞争 条件 NodeJS 程序 事件处理 数据      更新时间:2023-09-26

我想在两个单独的 Koa 中间件中多次使用 NodeJS 请求流,所以我将侦听器添加到它的"data"事件中。它现在可以工作了,但是我担心它背后有一个竞争条件,因为 - 根据文档 - 添加第一个事件处理程序后,一旦有任何可用数据,流就会开始调用它。如果订阅之间有其他代码,第二个事件侦听器是否未收到所有区块?还是以某种方式避免了(如何?

谢谢!

Node.js流使用 EventEmitter 发送事件。 任何监听事件的人(有多少听众都无关紧要)都将收到该事件。 因此,您的每个订阅者都将获得数据事件。

该文档旨在警告您,通过侦听"data"事件,它将流置于"旧"模式(或流 v1)。这意味着,如果由于某种原因,您的订阅者之一错过了一条消息,它就永远消失了。

但是,Node.js 也支持流管道。 您可以将一个可读流通过管道传输到多个输出流,数据将发送到每个读取器(每个读取器都有一个单独的读取缓冲区)。 同时,如果可读流结束,它将结束两个可写流。 每个流都有自己的读取缓冲区,这意味着如果他们暂时停止收听流(出于某种奇怪的原因),它们不会错过任何消息。

streamA.pipe(streamB)
streamA.pipe(streamC)