为了账号安全,请及时绑定邮箱和手机立即绑定

如何等待第一个完成的goroutine

如何等待第一个完成的goroutine

Go
泛舟湖上清波郎朗 2021-04-08 14:15:09
对于相同的任务,我有两种算法,一种在某些情况下最佳,另一种在其他情况下最佳。因此,我想在处理任务时同时启动两个goroutine,并且仅使用第一个完成的goroutine返回的结果。另外,在结果中,我需要知道它是由哪种算法返回的。如果我认为第一个返回的结果不正确,我想等待第二个结果。我通过https://golang.org/pkg/sync/的文档阅读,似乎只能等待所有goroutine完成。如何在golang中实现这个想法?
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我认为您不需要使用sync,尽管我确定您可以提出一个可行的解决方案。我认为最简单的解决方案是:

  1. 为每个数据创建一个新通道。我不确定这会对性能产生影响,因此您可以对此进行一些检查。

  2. 将相同的输出通道发送到两种算法。

  3. 取下通道中的第一个值,看看是否喜欢它。

  4. 如果不这样做,则取第二个值。

  5. 继续,不用担心开放频道。我们正在进行垃圾收集。

像这样的东西:

type Result struct {

    Value     string

    Algorithm string

}


func (r *Result) String() string {

    return r.Value

}


func A(in string, out chan *Result) {

    out <- &Result{"A", "A"}

}


func B(in string, out chan *Result) {

    out <- &Result{"B", "B"}

}


func main() {

    data := []string{"foo", "bar", "baz"}


    for _, datum := range data {

        resultChan := make(chan *Result, 2)

        expectedResult := "B"


        go A(datum, resultChan)

        go B(datum, resultChan)


        result := <-resultChan

        if result.Value != expectedResult {

            fmt.Println("Unexpected result: ", result)

            result = <-resultChan

        }


        fmt.Println("Got result: ", result)

    }

}


查看完整回答
反对 回复 2021-04-19
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信