Concurrency 是否可能从Go中的多个goroutine中的一个接收结果?
我最近才了解了谷歌的编程语言Go。我对它提供的对并发性的支持很感兴趣,并开始进一步了解它。然而,我去看看Go是如何实现一个特定的并发特性的,到目前为止,我还没有看到任何证据表明这个特性存在 这里有一个假设情况:假设我们正在编程一个函数来确定特定输入的Foo值。对于任何给定的输入,都可以在域A或域B中找到Foo值(不是同时在两个域中)。这些域中的搜索技术有很大不同,但它们的共同特点是,成功的搜索往往会快速返回,而不成功的搜索必须遍历整个数据集才能穷尽,因此需要很长时间 现在,在其他使用并发性的语言中(例如),可以对函数Foosearch进行编程,从而生成Asearch函数和Bsearch函数。这些函数将并发运行,并且每当其中任何一个出现一个答案时,该答案都将报告给调用函数Foosearch,该函数将终止它生成的所有未返回的函数 然而,使用Go的goroutines,看起来您只能用一个通道连接两个例程,因此您无法设置Asearch或Bsearch可以发送到的通道,这取决于首先找到答案的通道,并让Foosearch从中读取。它看起来也像是你无法在没有阻塞的情况下读取某个频道——因此你不能让Foosearch启动Asearch和Bsearch,并从这两个频道设置频道,然后在循环中运行检查,查看其中一个是否已生成答案Concurrency 是否可能从Go中的多个goroutine中的一个接收结果?,concurrency,go,goroutine,Concurrency,Go,Goroutine,我最近才了解了谷歌的编程语言Go。我对它提供的对并发性的支持很感兴趣,并开始进一步了解它。然而,我去看看Go是如何实现一个特定的并发特性的,到目前为止,我还没有看到任何证据表明这个特性存在 这里有一个假设情况:假设我们正在编程一个函数来确定特定输入的Foo值。对于任何给定的输入,都可以在域A或域B中找到Foo值(不是同时在两个域中)。这些域中的搜索技术有很大不同,但它们的共同特点是,成功的搜索往往会快速返回,而不成功的搜索必须遍历整个数据集才能穷尽,因此需要很长时间 现在,在其他使用并发性的语言
我对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