通过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左右,生产和消费两端实现了并行执行。