Channel
코루틴의 통신방법중 Flow 개념 이전에 Channel 이 먼저 추가되었다.
Channel 의 개념은 책에서는 이렇게 설명한다.
Channel 은 도서관의 책들처럼 책을 빌리기위해 다른사람이 먼저 책을 반납해야한다.
즉 Channel 에는 송신자와 수신자의 제한이 없다.
Channel 은 Hot Stream 으로 구독자의 여부에 관계없이 데이터가 생성이 된다. 하지만 구독을 할 때 데이터가 생성되는 것을 원할 때가 있다. [Cold Stream]
채널은 현재 개발하는 시점에는 자주 사용하지 않으므로, Hot - Cold stream 에 대해 더 자세히 알아보자.
Hot vs Cold
위에서 말했다시피, Hot Stream 과 Cold Stream 은 다음과 같은 차이가 있다.
- Hot Stream 은 데이터의 소비와 무관하게 원소가 생성된다.
- Cold Stream
- 요청이 있을때까지 원소가 생성되지 않는다.
- 최소한의 연산만 수행된다.
- 데이터를 보관하지 않으므로 메모리를 적게 사용한다.
콜드 플로우
플로우는 플로우 빌더로 생성할 수 있다.
val flow = flow {
while (true) {
val x = computeNextValue()
emit(x)
}
}
플로우는 Cold Stream 이기 때문에 값이 필요할 때에만 생성을 한다. 따라서 flow 는 빌더가 아니며 어떤 원소가 어떻게 생성되어야 하는지 정의된 것에 불과하다.
따라서 flow빌더는 CoroutineScope를 필요로 하지 않는다.
플로우는 최종연산자의 스코프에서 실행된다.(CoroutineScope)
private fun makeFlow() = flow {
println("Flow started")
for (i in 1..3) {
delay(1000)
emit(i)
}
}
fun main() = runBlocking {
val flow = makeFlow() // 빌더 정의
delay(1000)
println("Calling flow..")
flow.collect { println(it) } // collect 로 데이터 호출
println("Consuming again..")
flow.collect { println(it) }
}
//result
Calling flow..
Flow started
1
2
3
Consuming again..
Flow started
1
2
3
'도서 > 코틀린 코루틴' 카테고리의 다른 글
플로우 만들기 (0) | 2024.03.24 |
---|---|
플로우의 실제 구현 (0) | 2024.03.24 |
플로우란 무엇인가? (0) | 2024.03.24 |
3장 채널과 플로우 - 채널 (0) | 2024.03.08 |
2장 코루틴 라이브러리 - 공유 상태로 인한 문제 (1) | 2024.02.10 |