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 操作(例如 http
或 fs
模块),它们将数据异步推送到缓冲区中。因此,当数据被推入缓冲区时 while 循环仅 运行s,并在您读取整个缓冲区后立即停止。
节点的文档建议读取流的新最佳方式如下:
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 操作(例如 http
或 fs
模块),它们将数据异步推送到缓冲区中。因此,当数据被推入缓冲区时 while 循环仅 运行s,并在您读取整个缓冲区后立即停止。