通過Kotlin的Flow可以輕松實作生産者消費者模型。Flow預設是Cold的,生産者和消費者的通信是同步非阻塞的,也就是生産和消費會順序交替進行
suspend fun productor() = flow<Int> {
for (i in 1..10) {
delay(100)
emit(i)
println("produce $i")
}
}
fun main {
runBlcking {
productor().collect {
delay(100)
println("custom $it")
}
}
}
完成全部過程大約需要2s,因為生産者消費者按照下面順序進行

如果,我們希望生産者消費者兩端能夠實作異步非阻塞模型呢?此時可以使用ChannelFlow,顧名思義ChannelFlow中和了Coroutine Channel和Flow的優點:比Channel更冷(collect之後才觸發生産)比Flow更熱(生産消費可以并行執行)
suspend fun productor() = channelFlow<Int> {
for (i in 1..10) {
delay(100)
send(i) //emit 變為 send
println("produce $i")
}
}
此時,完成整個過程隻需要1s左右,生産和消費兩端實作了并行執行。