zoukankan      html  css  js  c++  java
  • Go语言通用重试函数封装

    代码

    以下实现了两个方法,分别是

    1. 设定最大重试次数,对一个方法进行重试
    2. 设定最大重试时间,对一个方法进行重试
    
    //重试,限制次数
    func RetryTimes(name string, tryTimes int, sleep time.Duration, callback func() error) (err error) {
    	for i := 1; i <= tryTimes; i++ {
    		err = callback()
    		if err == nil {
    			return nil
    		}
    		fmt.Printf("[%v]失败,第%v次重试, 错误信息:%s 
    ", name, i, err)
    		time.Sleep(sleep)
    	}
    	err = fmt.Errorf("[%v]失败,共重试%d次, 最近一次错误:%s 
    ", name, tryTimes, err)
    	fmt.Println(err)
    	return err
    
    }
    
    //重试,限制时间
    func RetryDurations(name string, max time.Duration, sleep time.Duration, callback func() error) (err error) {
    	t0 := time.Now()
    	i := 0
    	for {
    		err = callback()
    		if err == nil {
    			return
    		}
    		delta := time.Now().Sub(t0)
    		if delta > max {
    			fmt.Printf("[%v]失败,超过最大时间%s, 共重试%d次,最近一次错误: %s 
    ", name, max, i, err)
    			return err
    		}
    		time.Sleep(sleep)
    		i++
    		fmt.Printf("[%v]失败,第%v次重试, 错误信息:%s 
    ", name, i, err)
    	}
    }
    

    使用

    func main() {
    	//示例任务函数,只会失败
    	var task = func() error {
    		return errors.New("task error")
    	}
    
    	fmt.Println("RetryTimes")
    	//设定3秒最大重试次数,最大3次,1秒重试一次
    	RetryTimes("测试任务", 3, time.Second, task)
    
    	fmt.Println("RetryDurations")
    	//设定3秒最大重试期限,最多3秒,1秒重试一次
    	RetryDurations("测试任务", 3*time.Second, time.Second, task)
    }
    

    运行结果如下

    就是这么简单粗暴,light weight baby~

  • 相关阅读:
    Vue框架的两种使用方式
    转淘宝前端的一篇文章作备份
    分享两个细致、全面讲解Vue和React源码的链接
    网络慢。。。
    mysql的查询使用explain的讲解
    pv,uv的意义
    vi
    php中经常使用的string函数
    dirname(__FILE__) === __DIR__
    phpstorm开发环境搭建流程
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/13857384.html
Copyright © 2011-2022 走看看