加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:59:32 所属栏目:Java 来源:网络整理
导读:我刚才刚刚了解了Google的编程语言Go.我对它提供的并发支持很感兴趣,并着手了解它的更多信息.但是,我去看看Go如何实现并发的特定功能,到目前为止我还没有看到任何证据表明这个功能完全存在. 这是一个假设的情况:假设我们正在编程一个函数来确定特定输入的Fo
我刚才刚刚了解了Google的编程语言Go.我对它提供的并发支持很感兴趣,并着手了解它的更多信息.但是,我去看看Go如何实现并发的特定功能,到目前为止我还没有看到任何证据表明这个功能完全存在.

这是一个假设的情况:假设我们正在编程一个函数来确定特定输入的Foo值.对于任何给定的输入,Foo值可以在域A或域B中找到(不在两者中).在这些域中搜索的技术是完全不同的,但它们共享成功搜索倾向于快速返回的属性,而不成功的搜索必须遍历整个数据集才能详尽无遗,因此需要很长时间.

现在,在使用并发的其他语言(例如Cilk)中,可以对Foosearch函数进行编程,以便它生成Asearch函数和Bsearch函数.这些函数将同时运行,并且每当它们中的任何一个得到答案时,该答案将被报告给调用函数Foosearch,它将终止它已经生成但未返回的任何函数.

但是,使用Go的goroutines,看起来你只能通过一个频道连接两个例程 – 所以你无法设置Asearch或Bsearch可以发送的频道,具体取决于首先找到答案,并从中读取Foosearch它.它看起来你不能在没有阻塞的情况下从频道读取 – 所以你不能让Foosearch启动Asearch和Bsearch并从两者设置频道,然后在循环中运行检查以查看是否有一个或哪个产生了一个答案.

我对Go的并发限制的理解是否正确?还有另一种方法可以达到给定的结果吗?

解决方法

不,我不相信你对Go限制的理解是正确的.

首先,我在Go中没有看到任何限制两个例程之间通信的渠道.您可以将同一个频道传递给Asearch和Bsearch,然后完成的任何一个都可以在该频道上发送结果.

如果你想使用两个通道,并等待其中一个获得结果,你可以使用select语句.从Go tutorial开始,选择用于发送请求的通道的示例,以及用于通知服务器退出的示例:

21    func server(op binOp,service chan *request,quit chan bool) {
22        for {
23            select {
24            case req := <-service:
25                go run(op,req);  // don't wait for it
26            case <-quit:
27                return;
28            }
29        }
30    }

此外,虽然从通道接收通常阻止,您也可以从通道执行non-blocking receive.

If a receive expression is used in an
assignment or initialization of the
form

06001

the receive operation becomes
non-blocking. If the operation can
proceed,the boolean variable ok will
be set to true and the value stored in
x; otherwise ok is set to false and x
is set to the zero value for its type
(§07003).

因此,有几种方法可以在不阻塞的情况下等待多个goroutine的结果.我想我会选择使用select多路复用的多个通道,因为你可以轻松地告诉哪个例程返回结果,而不必将这些信息打包到你发送的值或进行其他形式的带外通信.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读