簡體   English   中英

buffer 和 stream - 它們有什么關系?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM