Kotlin:在不同协程中接收元素无法正常工作
Kotlin: receiving elements in different coroutine is not working properly
我已经了解了 kotlin 协程代码。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking <Unit> {
val channel = Channel<Int>(4)
val sender = launch (coroutineContext) {
repeat(10) {
println("sending $it")
channel.send(it)
delay(100)
}
}
delay(1000)
//launch { for (y in channel) println("receiving $y") }
for (y in channel) println("receiving $y")
}
它工作正常。如果我将从通道接收元素的逻辑放入另一个协程(即,将 for
放入 launch
中,如注释代码中所示),那么它会在下面的输出处被击中(即,我期待发送和接收到 10,但卡在 receiving 3
)。
sending 0
sending 1
sending 2
sending 3
sending 4
receiving 0
receiving 1
receiving 2
receiving 3
如何在另一个协程中无故障地接收元素?
我使用的是版本 compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1")
原因是你的频道没有关闭,所以你的for-each
循环可能永远不会结束。如果您在 repeat
块之后关闭您的频道,您的代码将正常完成:
进口kotlinx.coroutines。*
导入 kotlinx.coroutines.channels.*
fun main() = runBlocking <Unit> {
val channel = Channel<Int>(4)
val sender = launch (coroutineContext) {
repeat(10) {
println("sending $it")
channel.send(it)
delay(100)
}
channel.close()
}
delay(1000)
launch { for (y in channel) println("receiving $y") }
}
我已经了解了 kotlin 协程代码。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking <Unit> {
val channel = Channel<Int>(4)
val sender = launch (coroutineContext) {
repeat(10) {
println("sending $it")
channel.send(it)
delay(100)
}
}
delay(1000)
//launch { for (y in channel) println("receiving $y") }
for (y in channel) println("receiving $y")
}
它工作正常。如果我将从通道接收元素的逻辑放入另一个协程(即,将 for
放入 launch
中,如注释代码中所示),那么它会在下面的输出处被击中(即,我期待发送和接收到 10,但卡在 receiving 3
)。
sending 0
sending 1
sending 2
sending 3
sending 4
receiving 0
receiving 1
receiving 2
receiving 3
如何在另一个协程中无故障地接收元素?
我使用的是版本 compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1")
原因是你的频道没有关闭,所以你的for-each
循环可能永远不会结束。如果您在 repeat
块之后关闭您的频道,您的代码将正常完成:
进口kotlinx.coroutines。* 导入 kotlinx.coroutines.channels.*
fun main() = runBlocking <Unit> {
val channel = Channel<Int>(4)
val sender = launch (coroutineContext) {
repeat(10) {
println("sending $it")
channel.send(it)
delay(100)
}
channel.close()
}
delay(1000)
launch { for (y in channel) println("receiving $y") }
}