我只是最近才了解Google的编程语言Go。它为并发提供了支持,对此我很感兴趣,并且开始学习更多有关它的知识。但是,我去看看Go是如何实现并发的特定功能的,到目前为止,我还没有任何证据表明该功能确实存在。这是一个假设的情况:假设我们正在编写一个函数来确定特定输入的Foo值。对于任何给定的输入,在域A或域B中都不能找到Foo值(两者都不存在)。这些域中的搜索技术有很大不同,但是它们共享的属性是成功的搜索往往会很快返回,而不成功的搜索则必须遍历整个数据集才能详尽无遗,因此需要很长时间。现在,在使用并发的其他语言(例如Cilk)中,可以对Foosearch函数进行编程,以便产生Asearch函数和Bsearch函数。这些函数将同时运行,并且每当它们中的任何一个给出答案时,该答案都将被报告给调用函数Foosearch,该函数将终止所产生的所有未返回的函数。但是,使用Go的goroutine,您似乎只能将两个例程与一个通道连接-因此,您无法设置Asearch或Bsearch可以向其发送的通道,具体取决于哪个首先找到答案,并让Foosearch从中读取它。看起来您也无法从某个通道读取而不阻止它-因此您无法让Foosearch启动Asearch和Bsearch并从这两个通道建立通道,然后循环运行以查看是否产生了另一个通道答案。我对Go并发限制的理解正确吗?还有另一种方法可以达到给定的结果吗?
2 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
您可以使用select关键字从多个渠道接收。
该值将从具有比其他结果更早的结果的通道中获取。
var c1, c2 chan int;
var result int;
select {
case result = <-c1:
print("received ", result, " from c1\n");
case result = <-c2:
print("received ", result, " from c2\n");
}
- 2 回答
- 0 关注
- 255 浏览
添加回答
举报
0/150
提交
取消