如何等待第一个完成的goroutine

时间:2018-08-09 13:26:53

标签: go channel goroutine

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我认为您不需要使用QTime time; time.start(); for (int i = 0; i < Max; ++i) { CAircraftSituation s1 = situations.oldestAdjustedObject(); CAircraftSituation s2 = situations.latestAdjustedObject(); QVERIFY(s1.getAdjustedMSecsSinceEpoch() < s2.getAdjustedMSecsSinceEpoch()); } const int noHint = time.elapsed(); situations.setAdjustedSortHint(CAircraftSituationList::AdjustedTimestampLatestFirst); time.start(); for (int i = 0; i < Max; ++i) { CAircraftSituation s1 = situations.oldestAdjustedObject(); CAircraftSituation s2 = situations.latestAdjustedObject(); QVERIFY(s1.getAdjustedMSecsSinceEpoch() < s2.getAdjustedMSecsSinceEpoch()); } const int hint = time.elapsed(); const double ratio = static_cast<double>(hint) / static_cast<double>(noHint); // expected <1.0 ,尽管我确信您可以提出一个可行的解决方案。我认为最简单的解决方案是:

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

类似这样的东西:

sync

答案 1 :(得分:-1)

您可以使用缓冲通道来实现这一点,简单的代码是:

package main

import (
    "fmt"
)
type Result struct {
    Value     string
    Algorithm string
}

func DoTaskA(out chan *Result) {
    out <- &Result{"A", "A"}
}

func DoTaskB(out chan *Result) {
    out <- &Result{"B", "B"}
}

func IsGood(re *Result) bool {
    return re.Value == "B"
}

func main() {
    out := make(chan *Result, 1)
    go DoTaskA(out)
    go DoTaskB(out)
    for {
        re := <- out
        if IsGood(re) {
            fmt.Println("The chosen one is:", re.Algorithm)
            return
        }
    }
}