登录
首页 >  Golang >  Go问答

使用通道在Go语言中实现重试逻辑

来源:stackoverflow

时间:2024-03-03 10:51:21 283浏览 收藏

大家好,今天本人给大家带来文章《使用通道在Go语言中实现重试逻辑》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我正在启动两个并发执行路径(也称为 goroutine)来执行两项作业

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()
}()

今天关于《使用通道在Go语言中实现重试逻辑》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>