节点的文档表明,对于读取流的新的最佳方法如下:
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请求,则该进程必须在块被读取之前阻塞,然后才能发送它。
这个阻止IO阻止哪个node.js试图避免?
答案 0 :(得分:2)
这里需要注意的重要一点是它在等待更多输入到达流的意义上没有阻塞。它只是检索流的内部缓冲区的当前内容。这种循环很快就会完成,因为根本没有等待I / O.
答案 1 :(得分:0)
流可以是同步的也可以是异步的。如果可读流同步推送内部缓冲区中的数据,那么您将获得同步流。是的,在这种情况下,如果它同步推送大量数据,节点的事件循环将无法运行直到所有数据都被推送。
有趣的是,如果您甚至删除readble
回调中的while循环,则流模块internally calls a while loop一次并继续运行,直到读取所有推送的数据。
但是对于异步IO操作(例如http
或fs
模块),它们在缓冲区中异步推送数据。所以while循环只在数据被缓冲区推送时运行,并在你读完整个缓冲区后立即停止。