gpt4 book ai didi

go - 如何等待第一个完成的 goroutine

转载 作者:IT王子 更新时间:2023-10-29 02:09:24 25 4
gpt4 key购买 nike

对于同一任务,我有两种算法,一种最适合某些情况,另一种最适合其他情况。

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

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

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

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

最佳答案

我认为您不需要使用 sync,但我相信您可以想出一个解决方案。我认为最简单的解决方案是:

  1. 为每条数据创建一个新 channel 。我不确定这对性能的影响,所以你可以做一些检查。
  2. 将相同的输出 channel 发送到两种算法。
  3. 获取 channel 中的第一个值,看看您是否喜欢它。
  4. 如果不这样做,则取第二个值。
  5. 继续,不用担心开放 channel 。 We have garbage collection in go .

像这样:

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)
}
}

关于go - 如何等待第一个完成的 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com