我有一种情况,我想异步使用ReceiveChannel
构造一个produce
,但是它挂了。这是一个简化的示例:
runBlocking {
val deferredChannel = async {
produce<String> { send("foo") }
}
val channel = deferredChannel.await()
println("Got channel")
val value = channel.receive()
println("Got value $value")
}
println
均未命中。可能存在某种协程僵局,但我不清楚在何处/如何进行。如何异步生成
ReceiveChannel
?编辑:如果我将
produce
更改为produce(capacity = 1)
,则可以使用,但是为什么呢?不管生产者的能力如何,await()
至少不成功吗?如果我想保持容量= 0,该怎么办? 最佳答案
检查您调用的produce()
方法上的docs,尤其是检查我们具有的容量参数和Channel
上的docs(重点是我的):
这可能是它挂起的原因。您正在send
线程上调用async
,然后为其调用await
...但是,正如文档所说,尚无其他例程调用receive
...,因此它将挂起直到发生这种情况,在这种情况下将挂起。
检查Channel上的同一链接,我们还看到为什么给它一个大于0的数字可以解决这个问题(强调我的意思):