본문 바로가기
도서/코틀린 코루틴

핫 데이터 소스와 콜드 데이터 소스

by 안스 인민군 2024. 3. 24.

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