반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

[코틀린 코루틴] 핫 데이터 소스와 콜드 데이터 소스 본문

Kotlin/코틀린 코루틴

[코틀린 코루틴] 핫 데이터 소스와 콜드 데이터 소스

어리둥절범고래 2024. 11. 24. 19:01
반응형
  • 핫 데이터 스트림: 데이터를 지속적으로 발행하며 구독자가 공유하는 실시간 스트림이다. 과거 데이터를 놓칠 가능성이 있지만, 실시간성을 요구하는 상황에 적합하다.
  • 콜드 데이터 스트림: 구독자마다 독립적인 데이터 흐름을 생성하여 항상 처음부터 데이터를 제공하며, 비동기 작업이나 기록된 데이터를 처리하는 데 유용하다.

 

 

핫 채널, 콜드 플로우

 

플로우는 다음과 같이 생성할 수 있다.

val flow = flow { 
    while (true) {
        val x = computeNextValue()
        emit(x)
    }
}

이는 채널을 생성하는 produce와 비슷한 형태의 빌더인 것을 알 수 있다.

val channel = produce {
    while (true) {
        val x = computeNextValue()
        emit(x)
    }
}

 

채널(핫)은 예제와 같이 모든 원소를 소비하고 나면 두 번째 소비자는 채널이 비어있고 닫혀있는걸 발견하게 된다.

private fun CoroutineScope.makeChannel() = produce {
    println("Channel started")
    for (i in 1..3) {
        delay(1000)
        send(i)
    }
}

suspend fun main() = coroutineScope {
    val channel = makeChannel()

    delay(1000)
    println("Calling channel...")
    for (value in channel) {
        println(value)
    }
    println("Consuming again...")
    for (value in channel) {
        println(value)
    }
}
//Channel started
//Calling channel...
//1
//2
//3
//Consuming again...

 

플로우(콜드)를 사용해 처리하는 방식은 예제와 같이 값이 필요할 때 생성된다.

이로써 flow는 빌더가 아니며, 최종 연산(collect)이 호출될 때 원소가 어떻게 생성되어야 하는지 정의한다는 것을 알 수 있다.

private fun makeFlow() = flow {
    println("Channel started")
    for (i in 1..3) {
        delay(1000)
        emit(i)
    }
}

suspend fun main() = coroutineScope {
    val flow = makeFlow()

    delay(1000)
    println("Calling flow...")
    flow.collect { value -> println(value) }
    println("Consuming again...")
    flow.collect { value -> println(value) }
}
//Calling flow...
//Channel started
//1
//2
//3
//Consuming again...
//Channel started
//1
//2
//3
반응형