gpt4 book ai didi

kotlin - 关闭后忽略协程 channel 的报价

转载 作者:行者123 更新时间:2023-12-02 12:59:02 25 4
gpt4 key购买 nike

是否有一种好方法可以让 channel 在关闭后忽略报价而不抛出异常?

目前,似乎只有 try catch 会起作用,因为 isClosedForSend 不是原子的。

或者,如果我根本不关闭 channel ,会有问题吗?对于我的特定用例,我使用 channel 作为 Android 实时数据的替代方案(因为除了从任何线程发送值和从主线程监听之外,我不需要任何好处)。在那种情况下,我可以通过只在我想要时发送值的生产者收听 channel ,而忽略所有其他输入。

理想情况下,我有一个解决方案,其中 ReceiveChannel 仍然可以完成监听,但 SendChannel 在提供新值时永远不会崩溃。

最佳答案

channel 抛出这个异常by design , 作为正确沟通的方式。

如果你绝对必须有这样的东西,你可以使用这种扩展函数:

private suspend fun <E> Channel<E>.sendOrNothing(e: E) {
try {
this.send(e)
}
catch (closedException: ClosedSendChannelException) {
println("It's fine")
}
}

您可以使用以下代码对其进行测试:

val channel = Channel<Int>(capacity = 3)
launch {

try {
for (i in 1..10) {
channel.sendOrNothing(i)
delay(50)
if (i == 5) {
channel.close()
}
}

println("Done")
}
catch (e: Exception) {
e.printStackTrace()
}
finally {
println("Finally")
}
}

launch {
for (c in channel) {
println(c)
delay(300)
}
}

您会注意到,由于 channel 已关闭,生产者将开始打印“It's fine”,但消费者仍将能够读取前 5 个值。

关于你的第二个问题:视情况而定。

Channels 没有这么大的开销,suspended coroutines 也没有。但是泄漏就是泄漏,你知道的。

关于kotlin - 关闭后忽略协程 channel 的报价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com