My favorite #golang retry function

爱被打了一巴掌 2022-06-05 22:21 210阅读 0赞
  1. func retry(attempts int, sleep time.Duration, callback func() error) (err error) {
  2. for i := 0; ; i++ {
  3. err = callback()
  4. if err == nil {
  5. return
  6. }
  7. if i >= (attempts - 1) {
  8. break
  9. }
  10. time.Sleep(sleep)
  11. log.Println("retrying after error:", err)
  12. }
  13. return fmt.Errorf("after %d attempts, last error: %s", attempts, err)
  14. }
  15. func retryDuring(duration time.Duration, sleep time.Duration, callback func() error) (err error) {
  16. t0 := time.Now()
  17. i := 0
  18. for {
  19. i++
  20. err = callback()
  21. if err == nil {
  22. return
  23. }
  24. delta := time.Now().Sub(t0)
  25. if delta > duration {
  26. return fmt.Errorf("after %d attempts (during %s), last error: %s", i, delta, err)
  27. }
  28. time.Sleep(sleep)
  29. log.Println("retrying after error:", err)
  30. }
  31. }

use

  1. var signedContent []byte
  2. err := retry(5, 2*time.Second, func() (err error) {
  3. signedContent, err = signFile(unsignedFile, contents)
  4. return
  5. })
  6. if err != nil {
  7. log.Println(err)
  8. http.Error(w, err.Error(), 500)
  9. return
  10. }

相关github地址
https://github.com/giantswarm/retry-go
https://github.com/cenkalti/backoff

发表评论

表情:
评论列表 (有 0 条评论,210人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 5442 Favorite Donut

    第一种方法,最小表示法 其实呢,你将每一个字母反转一下,将’a’变成’z’,就是最小表示法。 但是反转之后,我们如果用最小表示法,得到的是,在原串上位置最靠后的情况,与

    相关 my favorite --------- 引用

    引用 引用是我们C++中新引入的一种机制,那么到底什么是引用呢? 引用概念:引用不是新定义一个变量,而是给已存变量取了一个别名,编译器不会为引用变量开辟内存空间,