본문 바로가기
IT/node.js

[node.js] readable stream - two modes (4)

by 내일은교양왕 2024. 5. 5.

https://nodejs.org/api/stream.html#two-reading-modes 를 참고한 글입니다.


object mode와 연관없는 읽기 모드를 설명한다.

flowing modepaused mode가 있다.

 

flowing mode은 시스템으로부터 자동으로 데이터를 읽고 EventEmitter interface에서 발생하는 이벤트를 이용하여 최대한 빠르게 앱에 데이터를 제공한다.

const fs = require('fs')

const rs = fs.createReadStream('lowercase.txt');

rs.on('data', (chunk) => {
  console.log(chunk)
});

 

paused mode는 stream.read()를 명시적으로 반드시 호출해서 stream에 있는 data chunk를 읽는다.

const fs = require('fs')

const rs = fs.createReadStream('lowercase.txt');

rs.on('readable', () => {
  let chunk;
  while (chunk = rs.read()) {
    console.log(chunk)
  }
});

 

모든 Readable stream은 paused mode로 시작하지만, 아래의 조건에 의하여 flowing mode로 전환될 수 있다.

 - 'data' event handler를 추가 시

 - stream.resume() 메소드를 호출 시

 - Writable에 데이터를 보내기 위해 stream.pip() 메소드를 호출시

 

다시 paused mode로 돌아갈 수 있는 방법도 있다.

 - 파이프 대상이 없는 경우 stream.pause() 메서드를 호출합니다.

 - 파이프 대상이 있는 경우 모든 파이프 대상을 제거하여 여러 파이프 대상을 제거할 수 있습니다. stream.unpipe() 메서드를 호출하여 여러 파이프 대상을 제거할 수 있습니다.

 

기억해야할 중요한 개념이 하나 있다.

Readable은 제공받은 데이터를 소비하거나 무시하기 전까지 데이터를 생성하지 않는다. 소비하는 과정이 비활성화 되어있거나 사라졌다면, Readable은 데이터를 생성하는것을 멈추려고 시도할것입니다.

 

하위호환성 이유로 'data' event handler를 지우는 건 자동적으로 스트림이 멈추지 않습니다. 또한, 도착지점이 pipe 되어 있는 상황에서 stream.pause()를 호출 시 도착지에서 데이터를 요청하거나 빼낼 때 stream이 멈춤을 유지하는 기능을 보장합니다.

 

만약 Readable이 flowing mode로 전환 되고 사용가능한 consumer가 없다면, 데이터는 유실됩니다. 이러한 상황은 'data' callback 이 없거나 'data' event handler가 스트림으로부터 지워진 상태에서 readable.resume() 을 호출 했을 때 발생합니다.

 

자동으로 flowing 모드를 멈추는 'readable' event handler를 추가하고 데이터를 readable.read()를 통해서 얻을 수 있습니다.

만약 'readable' event handler가 지워지고 'data' event handler가 존재한다면 스트림은 flowing으로 되돌아갑니다.

 

'IT > node.js' 카테고리의 다른 글

[node.js] stream - three states (5)  (0) 2024.05.05
[node.js] stream - buffering (3)  (0) 2024.05.04
[node.js] stream - object mode (2)  (0) 2024.05.03
[node.js] stream api - sample code (1)  (0) 2024.05.03
node.js, single thread 아닌가요?  (1) 2024.05.03