确保 Go 通道不会阻塞的可靠方法

我正在寻找一种可靠的方法来确保 Go 中的空通道不会阻止我的执行。我必须以特定顺序(优先级的种类)遍历多个通道,一旦我找到其中包含项目的通道,请阅读其中的一个。


目前我以类似的方式做一些事情:


if len(myChannel) > 0 {

    // Possible issue here: length could have changed to 0 making this blocking

    elm := <- myChannel

    return elm

}

从理论上讲,这可能会导致等待时间过长,而不同的频道可能有准备“服务”的项目。


有关如何改进的任何建议?我可以在通道中使用互斥锁,但感觉有更好的解决方案,尽管我不确定如何。


跃然一笑
浏览 154回答 2
2回答

炎炎设计

我不确定这是否真的回答了“是否有可靠的方法来确保 Go 通道不会阻塞”的问题。在 OP 的用例中,如果 recv 阻塞 / 只要集合中没有其他通道不会阻塞 / 就可以了,这就是公认的解决方案所实现的。这与“确保 recv 不会阻塞”不同,我认为无法绕过 OP 指出的竞争条件的基本限制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go