使用 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
.
的数字
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
.