Flow Context Preservation
Cold Stream
은 소비자가 소비를 시작할 때 데이터를 생산하고, 하나의 생산자는 하나의 소비자에게 값을 보낸다. Cold Stream은 데이터가 내부에서 생성된다.
CD 플레이어
val coldStream = flow<Int> {
emit(1)
emit(2)
}
coldStream.collect {
println(it) // 1 2 수신
}
coldStream.collect {
println(it) // 1 2 수신
}
flow를 여러 군데에서 collect할 순 있지만, collect 할 때마다 flow의 block이 새롭게 실행되며 이전 구독과는 독립적이다.
반면, Hot Stream
은 생산자가 소비자의 소비를 신경 쓰지 않고 생산하며, 하나의 생산자에 다수의 소비자가 존재할 수 있다. Hot Stream은 데이터가 외부에서 생성된다.
라디오
CoroutineScope(Dispatchers.Default).launch {
val channel = Channel<Int>()
launch {
// 외부에서 데이터를 생성
channel.send(1)
}
launch {
// 외부에서 데이터를 생성
channel.send(2)
channel.close()
}
channel.consumeEach {
println(it)
}
}
Channel
은 2개의 코루틴 사이를 연결한 파이프이다. 두 코루틴 사이에서 정보를 전송할 수 있도록 해준다. 채널에서 전송 또는 수신하는 실행을 suspend할 수 있다.
Rendezvous(Unbuffered)
랑데뷰는 채널에 버퍼가 없는 것을 말한다. 수신측 Coroutine과 송신측 Coroutine이 모두 가능한 상태로 모일때까지 suspend가 된다.
Conflated
크기가 1인 고정 버퍼가 있는 채널이 생성된다. 수신하는 코루틴이 송신하는 코루틴을 따라잡지 못했다면, 송신하는 쪽은 새로운 값을 버퍼의 마지막 아이템에 덮어씌운다.
수신 Coroutine이 다음 값을 받을 차례가 되면, 송신 Coroutine이 보낸 마지막 값을 받는다.
Buffered
고정된 크기의 버퍼를 생성하며 버퍼는 배열 형식이다. 송신 코루틴은 버퍼가 꽉 차있으면 새로운 값을 보내는 것을 중단한다.