Kotlin Flow与ChannelFlow

二次信任 提交于 2020-01-30 03:24:48

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!