2 回答
TA贡献1842条经验 获得超21个赞
查看 ,代码似乎期望从通道接收四条消息。但是,此代码最多可以从两个 goroutine 生成两个这样的消息,因此这是一个错误。countdone
此外,如果任何一个 goroutine 返回错误,它就不会写入通道,所以这是另一个错误。done
另一种写法可能是:
...
result := "processed"
for {
select {
case err := <-errc:
close(quit) // Tell the goroutines to terminate
log.Info("event: %s, %s", "", err.Error())
wg.Wait() // Wait for them to finish
return "", err
case <-done:
count++
if count == 2 {
wg.Wait()
return result, nil
}
}
TA贡献1829条经验 获得超6个赞
这正是 errgroup 包设计用于的分叉和联接并发类型:
func processEvent(ctx context.Context, i models.Foo) (string, error) {
err := func1()
if err != nil {
return "", err
}
g, ctx := errgroup.WithContext(ctx)
if strings.ToUpper(i.Status) != "OK" {
return "", nil
}
g.Go(func() error { return longTimeTask1(ctx) })
g.Go(func() error { return longTimeTask2(ctx) })
if err := g.Wait(); err != nil {
log.Printf("event: %v", err)
return "", err
}
return "processed", nil
}
(https://play.golang.org/p/JNMKftQTLGs)
- 2 回答
- 0 关注
- 52 浏览
添加回答
举报