python重试(指数退避算法)

1、指数退避算法

2、重试装饰器retry实现

```# -*- coding:utf-8 -*-
import time
from random import randint
from struct import Result, ProcedureException

def retry(max_retries=3, max_wait_interval=10, period=1, rand=False):

def _retry(func):

def __retry(*args, **kwargs):
MAX_RETRIES = max_retries
MAX_WAIT_INTERVAL = max_wait_interval
PERIOD = period
RAND = rand

retries = 0
error = None
while retries < MAX_RETRIES:
try:
result = func(*args, **kwargs)
if result.code == Result.ERROR:
raise ProcedureException("procedure occur error")
if result.code == Result.TIMEOUT:
raise ProcedureException("procedure request time out")
if result.code == Result.SUCCESS:
return result
except Exception, ex:
error = ex
finally:
sleep_time = min(2 ** retries * PERIOD if not RAND else randint(0, 2 ** retries) * PERIOD, MAX_WAIT_INTERVAL)
time.sleep(sleep_time)
retries += 1
print "第", retries, "次重试, ", "等待" , sleep_time, "秒"
if retries == MAX_RETRIES:
if error:
raise error
else:
raise ProcedureException("unknown")
return __retry
return _retry```

1）枚举类Result，标识过程调用的状态，其中有三个状态，成功SUCCESS，失败ERROR，超时TIMEOUT；

2）异常ProcedureException，在retry装饰器中我们判断了状态，如果是失败和超时场景，我们将会抛出这个异常。

```from enum import Enum, unique

@unique
class Result(Enum):
SUCCESS = 0
TIMEOUT = 1
ERROR = 2

class ProcedureException(Exception):
def __init__(self, message):
Exception.__init__(self, message)```

retry装饰器会重试以下两个场景：

1）Procedure函数func出现异常：TIMEOUT和ERROR

2）未知异常：Procedure函数func可以抛出未能处理的异常，例如func函数可能是网络读写，遇到网络超时，链接断开等，抛出timeout或者broken pipe。

1）不随机，将会以2**retries，作为重试时间

2）随机，将会在(0,2**retries）之间随机一个数，作为重试时间

3、测试一下

1）重试10次，随机，最大间隔10s

```# -*- coding:utf-8 -*-
from decorator import retry
from struct import Result

@retry(rand=True, max_retries=10, max_wait_interval=10)
def do_something():

class result(object):
def __init__(self, code):
self.code = code
print "##########  调用结果", Result.ERROR, " ############"
return result(Result.ERROR)

do_something()```

```/Users/didi/anaconda/bin/python /Users/didi/test/pythoneer/retry/test.py
##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############
Traceback (most recent call last):

File "/Users/didi/test/pythoneer/retry/test.py", line 14, in <module>
do_something()
File "/Users/didi/test/pythoneer/retry/decorator.py", line 36, in __retry
if error:
struct.ProcedureException: procedure occur error```

2）重试5次，不随机，最大间隔10s

```# -*- coding:utf-8 -*-
from decorator import retry
from struct import Result

@retry(rand=False, max_retries=5, max_wait_interval=10)
def do_something():

class result(object):
def __init__(self, code):
self.code = code
print "##########  调用结果", Result.ERROR, " ############"
return result(Result.ERROR)

do_something()```

```/Users/didi/anaconda/bin/python /Users/didi/test/pythoneer/retry/test.py
##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

##########  调用结果 Result.ERROR  ############

Traceback (most recent call last):
File "/Users/didi/test/pythoneer/retry/test.py", line 14, in <module>
do_something()
File "/Users/didi/test/pythoneer/retry/decorator.py", line 37, in __retry
raise error
struct.ProcedureException: procedure occur error```

0 条评论

相关文章

1998

一个移动开发者的Mock数据之路 原

在前端开发中，很大一部分工作都是将后台数据获取到后展示在前端界面上。如果接口是现成的，这个过程还相对容易一些，但是如果接口的开发和前端开发是同时进行的，...

731

3535

2394

4228

LeetCode130. 被围绕的区域

bfs题，主函数中枚举每一个起点，如果是'O'就开始bfs搜索，首先将'O'变为'X'，然后将周围是'O'都入队。这里有个地方要注意，如果'O'并不是被...

1002

Linux命令（12）——wc命令

（3）从文件读取输入文件名。如果有多个文件名，并且希望 wc 从一个文件中读取它们，那么使用-files0-from 选项。这里将文件名称必须以NULL字符结束...

1031

一致性（连续性）hash算法（Consistent hashing）一致性（连续性）hash算法（Consistent hashing）

Consistent hashing is a scheme that provides hash table functionality in a way t...

1262

9840