天天看点

Kotlin Flow与ChannelFlow

通过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,因为生产者消费者按照下面顺序进行

Kotlin Flow与ChannelFlow

如果,我们希望生产者消费者两端能够实现异步非阻塞模型呢?此时可以使用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")
        }
    }
           
Kotlin Flow与ChannelFlow

此时,完成整个过程只需要1s左右,生产和消费两端实现了并行执行。