对于相同的任务,我有两种算法,一种在某些情况下最佳,另一种在其他情况下。
所以我想在每次处理任务时同时启动两个goroutine,并且仅使用第一个完成的goroutine返回的结果。
另外,结果是,我需要知道它是由哪种算法返回的。如果我认为返回的第一个结果不正确,我想等待第二个结果。
我通过https://golang.org/pkg/sync/的文档阅读,似乎它只能等待所有goroutine完成。
如何在golang中实现这个想法?
答案 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
,尽管我确信您可以提出一个可行的解决方案。我认为最简单的解决方案是:
类似这样的东西:
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
}
}
}