使用 Kotlin Channel 是什么意思?

What does consuming a Kotlin Channel mean?

Kotlin 文档使用术语 consume 来描述 Channel#first() 等方法的行为以及 Channel#consumeEach().

等方法的名称

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

不消费到底是什么样子的?

频道API是否允许在不消费的情况下访问频道中的项目?

除了consumeEach(),消耗是否总是意味着完全清空一个通道?

"consume"的使用意味着它是一个终端操作,这个命令之外的任何东西都不能从通道中读取。您可以在 first and consumeEach 的 API 文档中更清楚地看到这一点:

The operation is terminal. This function consumes all elements of the original ReceiveChannel.

请注意,文档中也有此 API 将来会更改的警告。

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

以下代码的输出说明了"consuming"的含义和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.

的数字