并发 – 是否可以从Go中的多个goroutine中的一个接收结果?
我刚才刚刚了解了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,然后完成的任何一个都可以在该频道上发送结果. 如果你想使用两个通道,并等待其中一个获得结果,你可以使用 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.
因此,有几种方法可以在不阻塞的情况下等待多个goroutine的结果.我想我会选择使用select多路复用的多个通道,因为你可以轻松地告诉哪个例程返回结果,而不必将这些信息打包到你发送的值或进行其他形式的带外通信. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – Guava Charmatcher静态初始化慢
- 是否允许Java编译器对静态调用具有流敏感性?
- java – Eclipse:Ctrl Shift Right不正确
- WriteFile在使用WaitCommEvent时挂起应用程序
- java – Spring配置:无法找到Spring NamespaceHandler
- Java实现插入排序
- java – JPA错误:持久关系时出现重复键错误
- Java的NavigableMap.floorEntry的C Sharp中的等价物,ceilin
- spring整合JMS实现同步收发消息(基于ActiveMQ的实现)
- Java 调用Mysql dump 备份数据库