消费Kotlin Channel是什么意思?

时间:2018-11-19 03:42:04

标签: kotlin channel kotlinx.coroutines

Kotlin文档使用术语consume来描述诸如Channel#first()之类的方法的行为以及诸如Channel#consumeEach()之类的方法的名称。

我很难理解使用通道与不使用通道的含义。

非消费甚至是什么样?

Channel API是否允许无需消耗就访问通道中的项目?

除了consumeEach()之外,消费量是否总是意味着完全清空一个频道?

2 个答案:

答案 0 :(得分:1)

使用“ consume”表示这是一个终端操作,该命令之外的任何内容都无法从通道读取。您可以在firstconsumeEach的API文档中看到以下内容:

  

操作是终端。此功能消耗了原始ReceiveChannel的所有元素。

请注意,文档中还警告该API将来会更改。

阅读KT-167,以获取有关此主题的有用评论。

答案 1 :(得分:0)

以下代码的输出说明了“消费”的含义和consumeEach的作用。

fun f1() = runBlocking {
    val numbers = produce {
        repeat(5) {
            send(it)
            delay(100)
        }
    }
    run {
        for (i in numbers) {
            trace(i)
            if (i == 2) return@run
        }
    }
    trace("after run")
    for (i in numbers) {
        trace(i)
    }
    trace("exiting f1")
}
f1()

println()

fun f2() = runBlocking {
    val numbers = produce {
        repeat(5) {
            send(it)
            delay(100)
        }
    }
    run {
        numbers.consumeEach {
            trace(it)
            if (it == 2) return@run
        }
    }
    trace("after run")
    for (i in numbers) {
        trace(i)
    }
    trace("exiting f2")
}
f2()

输出:

[main @coroutine#1]: 0
[main @coroutine#1]: 1
[main @coroutine#1]: 2
[main @coroutine#1]: after run
[main @coroutine#1]: 3
[main @coroutine#1]: 4
[main @coroutine#1]: exiting f1

[main @coroutine#3]: 0
[main @coroutine#3]: 1
[main @coroutine#3]: 2
[main @coroutine#3]: after run
[main @coroutine#3]: exiting f2

我们看到(在f1中)我们可以停止在一个通道上进行迭代,然后再从中断处继续。但是,当使用consumeEach(在f2中)时,即使通道最初能够产生大于2的数字,我们也无法停止并继续。