안드로이드 개발자 노트
[코틀린 코루틴] 핫 데이터 소스와 콜드 데이터 소스 본문
반응형
- 핫 데이터 스트림: 데이터를 지속적으로 발행하며 구독자가 공유하는 실시간 스트림이다. 과거 데이터를 놓칠 가능성이 있지만, 실시간성을 요구하는 상황에 적합하다.
- 콜드 데이터 스트림: 구독자마다 독립적인 데이터 흐름을 생성하여 항상 처음부터 데이터를 제공하며, 비동기 작업이나 기록된 데이터를 처리하는 데 유용하다.
핫 채널, 콜드 플로우
플로우는 다음과 같이 생성할 수 있다.
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
반응형
'Kotlin > 코틀린 코루틴' 카테고리의 다른 글
[코틀린 코루틴] 플로우란 무엇인가? (0) | 2024.11.24 |
---|---|
[코틀린 코루틴] 채널, 셀렉트 (0) | 2024.11.18 |
[코틀린 코루틴] 8장. 잡과 자식 코루틴 기다리기 (0) | 2024.03.30 |