https://nodejs.org/api/stream.html#two-reading-modes 를 참고한 글입니다.
object mode와 연관없는 읽기 모드를 설명한다.
flowing mode와 paused 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 |