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

Concurrency 是否可能从Go中的多个goroutine中的一个接收结果?,concurrency,go,goroutine,Concurrency,Go,Goroutine,我最近才了解了谷歌的编程语言Go。我对它提供的对并发性的支持很感兴趣,并开始进一步了解它。然而,我去看看Go是如何实现一个特定的并发特性的,到目前为止,我还没有看到任何证据表明这个特性存在 这里有一个假设情况:假设我们正在编程一个函数来确定特定输入的Foo值。对于任何给定的输入,都可以在域A或域B中找到Foo值(不是同时在两个域中)。这些域中的搜索技术有很大不同,但它们的共同特点是,成功的搜索往往会快速返回,而不成功的搜索必须遍历整个数据集才能穷尽,因此需要很长时间 现在,在其他使用并发性的语言

我最近才了解了谷歌的编程语言Go。我对它提供的对并发性的支持很感兴趣,并开始进一步了解它。然而,我去看看Go是如何实现一个特定的并发特性的,到目前为止,我还没有看到任何证据表明这个特性存在

这里有一个假设情况:假设我们正在编程一个函数来确定特定输入的Foo值。对于任何给定的输入,都可以在域A或域B中找到Foo值(不是同时在两个域中)。这些域中的搜索技术有很大不同,但它们的共同特点是,成功的搜索往往会快速返回,而不成功的搜索必须遍历整个数据集才能穷尽,因此需要很长时间

现在,在其他使用并发性的语言中(例如),可以对函数Foosearch进行编程,从而生成Asearch函数和Bsearch函数。这些函数将并发运行,并且每当其中任何一个出现一个答案时,该答案都将报告给调用函数Foosearch,该函数将终止它生成的所有未返回的函数

然而,使用Go的goroutines,看起来您只能用一个通道连接两个例程,因此您无法设置Asearch或Bsearch可以发送到的通道,这取决于首先找到答案的通道,并让Foosearch从中读取。它看起来也像是你无法在没有阻塞的情况下读取某个频道——因此你不能让Foosearch启动Asearch和Bsearch,并从这两个频道设置频道,然后在循环中运行检查,查看其中一个是否已生成答案


我对Go并发限制的理解正确吗?是否有其他方法可以实现给定的结果?

您可以使用
选择
关键字从多个频道接收

该值将从结果早于其他通道的通道中获取

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");
}
var c1,c2 chan int;
var结果int;
挑选{

案例结果=不,我不相信你对围棋极限的理解是正确的

首先,我在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    }
21功能服务器(操作binOp、服务更改*请求、退出更改bool){
22为{
23选择{
24个案要求:=
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch