핫 vs 콜드
- 핫 데이터 스트림은 데이터를 소비하는 것과 무관하게 원소를 생성함.
- 콜드 데이터 스트림은 요청이 있을 때만 작업을 수행하며 아무것도 저장하지 않음.
- 자바의
Stream
은 코틀린의 Sequence
와 비슷한 특징을 가지고 있음.
핫 채널, 콜드 플로우
- 플로우를 생서하는 가장 일반적인 방법은
flow
빌더를 사용하는 것.
val channel = produce {
while (true) {
val x = computeNextValue()
send(x)
}
}
val flow = flow {
while (true) {
val x = computeNextValue()
emit(x)
}
}
- 두 빌더는 개념적으로 동일하지만, 채널과 플로우의 방식이 아주 다름.
- 채널
- 채널은 별도의 코루틴에서 계산을 하며, 핫이라 값을 곧바로 계산함.
- 채널은 핫 데이터 스트림이기 때문에 소비되는 것과 상관없이 값을 생성한 뒤에 가지게 됨.
- 수신자가 얼마나 많은지에 대해선 신경 쓰지 않음.
- 각 원소는 단 한 번만 받을 수 있기 때문에 첫 번째 수신자가 원소를 모두 소비하면 다음 수신자들은 채널이 비어있으면 어떤 원소도 받을 수 없음.
- 플로우
- 콜드 데이터 소스임. 그러므로 값이 필요할 때만 생성함.
- flow는 단지 최종 연산이 호출될 때 원소가 어떻게 생성되어야 하는지 정의한 것에 불과함.
- 플로우의 각 최종 연산은 처음부터 데이터를 처리하기 시작함.
궁금한 부분
- p.256 “각 원소는 단 한 번만 받을 수 있기 때문에 첫 번째 수신자가 원소를 모두 소비하면 다음 수신자들은 채널이 비어있으면 어떤 원소도 받을 수 없음.” << 요거 잘 이해가 안가는데… 핫 데이터 스트림은 모든 수신자들에게 공통하게 데이터를 주는게 아닌지!?