[英]buffer and stream - how are they related?
我在这里放一些代码:
const { createReadStream, ReadStream } = require('fs');
var readStream = createReadStream('./data.txt');
readStream.on('data', chunk => {
console.log('---------------------------------');
console.log(chunk);
console.log('---------------------------------');
});
readStream.on('open', () => {
console.log('Stream opened...');
});
readStream.on('end', () => {
console.log('Stream Closed...');
});
因此,stream 是数据从一个地方移动到另一个地方。 在这种情况下,从data.txt
文件到我的眼睛,因为我必须阅读它。
我在谷歌上读过这样的东西:
通常,数据的移动通常是为了处理它或读取它,并根据它做出决策。 但是随着时间的推移,进程可能会接收最少和最多的数据量。 因此,如果数据到达的速率快于进程消耗数据的速率,则多余的数据需要在某个地方等待轮到它处理。
另一方面,如果进程消耗数据的速度快于数据到达的速度,则较早到达的少数数据需要等待一定数量的数据到达才能被发送出去进行处理。
我的问题是:哪一行代码在“消费数据,处理数据”? 是console.log(chunk)
吗? 如果我有大量耗时的代码行而不是console.log(chunk)
,我的代码怎么会不从缓冲区获取更多数据并等待我的处理完成? 在上面的代码中,它似乎仍然会进入readStream.on('data')'s
回调..
我的问题是:哪一行代码是“消费数据,处理数据”
readStream.on('data', ...)
事件处理程序是“使用”或“处理”数据的代码。
如果我有一大行耗时的代码而不是 console.log(chunk),我的代码怎么会不从缓冲区中获取更多数据并等待我的处理完成呢?
如果耗时代码是同步的(例如阻塞),那么在同步代码完成之前不会再发生data
事件,因为只有您的事件处理程序在运行(在 node.js 的单线程事件循环驱动架构中)。 在您从事件处理程序回调 function 返回控制权之前,不会生成更多data
事件。
如果耗时的代码是异步的(例如,非阻塞并因此将控制返回给事件循环),那么即使先前的data
事件处理程序尚未完全完成其异步工作,也肯定会发生更多data
事件。 有时在执行异步工作时调用readStream.pause()
是合适的,以告诉 readStream 不要再生成任何data
事件,直到您准备好它们,然后您可以readStream.resume()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.