缓冲区和流-它们之间有何关系?

时间:2020-09-22 19:41:55

标签: javascript node.js stream buffer

我在这里放置一些代码:

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...');
});

因此,流是数据从一个地方到另一个地方的移动。在这种情况下,从data.txt文件到我的眼睛,因为我必须阅读它。

我在Google中读过这样的内容:

通常,数据移动通常是为了 处理或阅读,并据此做出决策。但是有一个 一个过程可能需要花费的最小和最大数据量。 因此,如果数据到达的速度快于处理速度 消耗数据,多余的数据需要在某个地方等待 待处理。

另一方面,如果进程使用数据的速度比处理速度快 到达,较早到达的少量数据需要等待一定时间 发送出去进行处理之前要到达的数据量。

我的问题是:哪一行代码“正在使用数据,正在处理数据”?是console.log(chunk)吗?如果我有大量耗时的代码行而不是console.log(chunk),那么我的代码将如何不从缓冲区中获取更多数据并等待处理完成?在上面的代码中,它似乎仍会进入readStream.on('data')'s回调。.

1 个答案:

答案 0 :(得分:1)

我的问题是:哪一行代码是“消费数据,处理数据”

readStream.on('data', ...)事件处理程序是用于“消耗”或“处理”数据的代码。

如果我有大量耗时的代码而不是console.log(chunk),那么我的代码将如何不从缓冲区中获取更多数据并等到处理完成后呢?

如果耗时的代码是同步的(例如阻塞),那么直到完成同步代码之后,再也不会发生data事件,因为只有事件处理程序正在运行(在单线程事件循环驱动的体系结构中) node.js)。除非您从事件处理程序回调函数返回控制,否则将不再生成data事件。

如果耗时的代码是异步的(例如,非阻塞并且因此将控制返回到事件循环),那么即使先前的data事件处理程序具有以下条件,也肯定会发生更多data事件尚未完全完成,这是异步工作。在进行异步工作时,有时最好调用readStream.pause(),以告诉readStream在准备好事件之前不要再生成data个事件,然后您可以readStream.resume()