go - go中使用channel实现重试机制
问题描述
我正在启动两个并发执行路径(又名 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()
我的问题是(除了导入一些第三方重试库)是否有更多惯用的方式来构建上述代码?渠道/选择方法会更加以去为中心吗?
解决方案
你的代码还不错。使用频道将是一个矫枉过正。
我会这样写,稍微轻一点。
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()
}()
推荐阅读
- python - 使用 PCA 或 t-SNE 和 Matplotlib 测量数据图
- node.js - 如何使用邮递员 JSON 插入 postgres 的数组列?
- php - Laravel 5.8 Edit 函数在我转储模型时返回 #connection: null 和 #table: null
- python - 泛化根据条件执行略有不同动作的类方法
- powershell - Powershell 环境变量 %username%
- linux-kernel - 为什么我不能在我的 Beaglebone 板上运行自定义应用程序?
- android - 错误:无法解析“:app@debug/compileClasspath”的依赖关系:无法下载twitter.aar(com.twitter.sdk.android:twitter:3.1.0)
- botframework - Services.AddTransient() 与 Services.AddBot()
- java - 使用休眠从表中获取单个日期值
- ios - Why JSON data from decoder to become UITableView datasource does not assigns?