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~

  • 相关阅读:
    学号 20172328 《程序设计与数据结构》第八周学习总结
    172328 结对编程练习_四则运算 第一周 阶段总结
    学号 20172328 《程序设计与数据结构》实验二报告
    20172328《程序设计与数据结构》第七周学习总结
    Educoder
    Educoder
    Educoder
    Educoder
    Educoder
    Educoder
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/13857384.html
Copyright © 2011-2022 走看看