【发布时间】:2015-02-25 12:51:29
【问题描述】:
我正在寻找一种可靠的方法来确保 Go 中的空通道不会阻止我的执行。我必须以特定顺序(某种优先级)遍历多个渠道,一旦找到其中包含项目的渠道,请阅读其中一个。
目前我以类似的方式做一些事情:
if len(myChannel) > 0 {
// Possible issue here: length could have changed to 0 making this blocking
elm := <- myChannel
return elm
}
理论上,这可能会导致等待时间过长,而不同的频道可能有一个准备好“服务”的项目。
关于如何改进的任何建议?我可以在频道中使用互斥锁,但感觉好像有更好的解决方案,虽然我不确定如何。
【问题讨论】:
-
为什么不使用
select声明? -
如何以动态方式编写这样的语句(例如迭代通道数组)?
-
一般来说,当多个 goroutine 写入这些通道时,不可能做你想做的事。在检查通道是否有剩余空间和发送到该通道的操作之间,其他人可能在通道中放入了一些东西,导致它阻塞。
-
@FUZxxl 所以这意味着每个通道的互斥锁将是唯一真正的解决方案?
-
@RobinUS2 或所有通道的一个互斥锁...正如我所说,这取决于您的用例。如果只有一个 Go 例程写入通道,则不需要。