首页 > 解决方案 > errgroup 的竞争条件?

问题描述

g.Go(func() error {
    result, err := makeDBCall()
    if err != nil {
        fmt.Println("Error 1")
        return err
    }
    return nil
}

g.Go(func() error {
    result, err := makeAnotherDBCall()
    if err != nil {
        fmt.Println("Error 2")
        return err
    }
    return nil
}

g.Go(func() error {
    result, err := makeAnotherAnotherDBCall()
    if err != nil {
        fmt.Println("Error 3")
        return err
    }
    return nil
}

err := g.Wait()
if err != nil {
    return
}

fmt.Println("Done with error Group")

我故意使其中一个dbCall()函数返回错误。在发出的 10 个请求中,可能有 3-5 个的输出为:

启动错误组

错误 1

完成错误组

标签: goconcurrency

解决方案


errgroup的文档表明“第一次调用返回非 nil 错误会取消该组;它的错误将由 Wait 返回。”

由于这些是同时运行的,因此无法预测故障发生的顺序。有时它会立即发生,有时仅在其他 goroutine 成功运行后发生。平均而言,听起来 3-5 在错误之前正在运行。一旦发生该错误,该组将被取消,任何尚未启动的 goroutine 将根本不会运行。


推荐阅读