为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以从Go中的多个goroutine中的一个接收结果?

是否可以从Go中的多个goroutine中的一个接收结果?

Go
猛跑小猪 2021-04-09 18:19:55
我只是最近才了解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");

}


查看完整回答
反对 回复 2021-04-26
  • 2 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信