如何等待第一个完成的goroutine

对于相同的任务,我有两种算法,一种在某些情况下最佳,另一种在其他情况下最佳。

因此,我想在处理任务时同时启动两个goroutine,并且仅使用第一个完成的goroutine返回的结果。

另外,在结果中,我需要知道它是由哪种算法返回的。如果我认为第一个返回的结果不正确,我想等待第二个结果。

我通过https://golang.org/pkg/sync/的文档阅读,似乎只能等待所有goroutine完成。

如何在golang中实现这个想法?


泛舟湖上清波郎朗
浏览 220回答 2
2回答

海绵宝宝撒

我认为您不需要使用sync,尽管我确定您可以提出一个可行的解决方案。我认为最简单的解决方案是:为每个数据创建一个新通道。我不确定这会对性能产生影响,因此您可以对此进行一些检查。将相同的输出通道发送到两种算法。取下通道中的第一个值,看看是否喜欢它。如果不这样做,则取第二个值。继续,不用担心开放频道。我们正在进行垃圾收集。像这样的东西:type Result struct {&nbsp; &nbsp; Value&nbsp; &nbsp; &nbsp;string&nbsp; &nbsp; Algorithm string}func (r *Result) String() string {&nbsp; &nbsp; return r.Value}func A(in string, out chan *Result) {&nbsp; &nbsp; out <- &Result{"A", "A"}}func B(in string, out chan *Result) {&nbsp; &nbsp; out <- &Result{"B", "B"}}func main() {&nbsp; &nbsp; data := []string{"foo", "bar", "baz"}&nbsp; &nbsp; for _, datum := range data {&nbsp; &nbsp; &nbsp; &nbsp; resultChan := make(chan *Result, 2)&nbsp; &nbsp; &nbsp; &nbsp; expectedResult := "B"&nbsp; &nbsp; &nbsp; &nbsp; go A(datum, resultChan)&nbsp; &nbsp; &nbsp; &nbsp; go B(datum, resultChan)&nbsp; &nbsp; &nbsp; &nbsp; result := <-resultChan&nbsp; &nbsp; &nbsp; &nbsp; if result.Value != expectedResult {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Unexpected result: ", result)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result = <-resultChan&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Got result: ", result)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go