Node 中新的读流方式会导致阻塞吗?

Does the new way to read streams in Node cause blocking?

节点的文档建议读取流的新最佳方式如下:

var readable = getReadableStreamSomehow();
readable.on('readable', function() {
  var chunk;
  while (null !== (chunk = readable.read())) {
    console.log('got %d bytes of data', chunk.length);
  }
});

对我来说,这似乎会导致阻塞 while 循环。这意味着如果节点通过读取和发送文件来响应 http 请求,则在发送块之前,进程必须在读取块时阻塞。

这不是 node.js 试图避免的阻塞 IO 吗?

这里要注意的重要一点是,它在等待更多输入到达流的意义上并不是阻塞。它只是检索流的内部缓冲区的当前内容。这种循环将很快完成,因为根本不需要等待 I/O。

流可以是同步的也可以是异步的。如果可读流将数据同步推送到内部缓冲区中,那么您将获得一个同步流。是的,在那种情况下,如果它同步推送大量数据,节点的事件循环将无法 运行,直到所有数据都被推送。

有趣的是,如果您甚至删除 readble 回调中的 while 循环,流模块 internally calls a while loop 一次并保持 运行ning 直到读取所有推送的数据。

但对于异步 IO 操作(例如 httpfs 模块),它们将数据异步推送到缓冲区中。因此,当数据被推入缓冲区时 while 循环仅 运行s,并在您读取整个缓冲区后立即停止。