我有一种情况,我想异步使用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的数字可以解决这个问题(强调我的意思):

10-06 06:55