天天看點

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左右,生産和消費兩端實作了并行執行。

繼續閱讀