我正在启动两个并发执行路径(又名 goroutines)来执行两个作业 const Retries = 10 wg.Add(2) go func() { for i := 0; i < Retries; i++ { retVal1, err1 = doSomeWork() if err1 != nil { fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", i+1, err1) continue } else { break } } if err1 != nil { log.Fatalf("ERROR job %s\n", err1) } wg.Done() }() go func() { for i := 0; i < Retries; i++ { retVal2, err2 = doSomeWork() if err2 != nil { fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", i+1, err2) continue } else { break } } if err2 != nil { log.Fatalf("ERROR job %s\n", err2) } wg.Done() }() wg.Wait()我的问题是(除了导入一些第三方重试库)是否有更多惯用的方式来构建上述代码?渠道/选择方法会更加以去为中心吗?
1 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
你的代码还不错。使用频道将是一个矫枉过正。
我会这样写,稍微轻一点。
const maxRetries int = 3
go func() {
var retries int
for {
retVal1, err1 = doSomeWork()
if err1 == nil {
break
}
retries++
if retries == maxRetries {
log.Fatalf("ERROR job %s\n", err1)
}
fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", retries, err1)
}
wg.Done()
}()
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消