go - 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
完成错误组
解决方案
errgroup的文档表明“第一次调用返回非 nil 错误会取消该组;它的错误将由 Wait 返回。”
由于这些是同时运行的,因此无法预测故障发生的顺序。有时它会立即发生,有时仅在其他 goroutine 成功运行后发生。平均而言,听起来 3-5 在错误之前正在运行。一旦发生该错误,该组将被取消,任何尚未启动的 goroutine 将根本不会运行。
推荐阅读
- javascript - 猫鼬模式错误:未定义的“类型”
- conditional-statements - 如何在 PDDL 中设置条件?
- powershell - Invoke-WebRequest 使用 SSO 从 Salesforce 下载 csv 文件
- salesforce - 翻译 Salesforce 案例摘要
- reactjs - React JS材料表 - 如何在材料表中选择当前页面的行
- python-3.x - 打印 Python 类的每个对象
- checkbox - ExtJS Sencha 复选框焦点颜色更改/禁用
- python - 努力研究如何使用 Discord.py 将嵌入式消息发送到某个频道
- node.js - TypeError: fs__WEBPACK_IMPORTED_MODULE_2__.readdirSync 不是函数(如何在打字稿中读取目录中的文件名?)
- r - 如何在选项卡面板中同时显示表格和图形?