为了账号安全,请及时绑定邮箱和手机立即绑定

go中使用channel实现重试机制

go中使用channel实现重试机制

Go
MYYA 2022-05-23 17:13:40
我正在启动两个并发执行路径(又名 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()

}()


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信