如不雅我们运行 haveatry 函数,那么直到 random.randint 返回 5,它才会履行停止,不然会一向从新履行。
retry 还可以接收一些参数,这个大年夜源码中 Retrying 类的初始化函数可以看到可选的参数:
- stopmaxattempt_number:用来设定最大年夜的测验测验次数,跨越该次数就停止重试
- stopmaxdelay:比瘸黎置成 10000,那么大年夜被装潢的函数开端履行的时光点开端,到函数成功运行停止或者掉败报错中断的时光点,只要这段时光跨越 10 秒,函数就不会再履行了
- wait_fixed:设置在两次 retrying 之间的逗留时光
- waitrandommin 和 waitrandommax:用随机的方法产生两次 retrying 之间的逗留时光
- waitexponentialmultiplier 和 waitexponentialmax:以指数的情势产生两次 retrying 之间的逗留时光,产生的值为 2^previousattemptnumber * waitexponentialmultiplier,previousattemptnumber 是前面已经 retry 的次数,如不雅产生的┞封个值跨越了 waitexponentialmax 的大年夜小,那么之后两个 retrying 之间的逗留值都为 waitexponentialmax。这个设计逢迎了 exponential backoff 算法,可以减轻壅塞的情况。
我们可以指定要在出现哪些异常的时刻再去 retry,这个要用 retryonexception 传入一个函数对象:
- def retry_if_io_error(exception):
- return isinstance(exception, IOError)
- @retry(retry_on_exception=retry_if_io_error)
- def read_a_file():
- with open("file", "r") as f:
- return f.read()
在履行 readafile 函数的过程中,如不雅报出异常,那么这个异常会以形参 exception 传入 retryifio_error 函数中,如不雅 exception 是 IOError 那么就进行 retry,如不雅不是就停止运行并抛出异常。
我们还可以指定要在获得哪些结不雅的时刻去 retry,这个要用 retryonresult 传入一个函数对象:
- def retry_if_result_none(result):
- return result is None
- @retry(retry_on_result=retry_if_result_none)
- def get_result():
- return None
其他相干材料:
- https://pypi.python.org/pypi/retry/
- https://julien.danjou.info/blog/2015/python-retrying
- https://github.com/rholder/retrying
【编辑推荐】
- 深刻Python列表的内部实现
- 应用Python供给高机能计算办事
- 深刻懂得GIL:若何写出高机能及线程安然的Python代码
- Python算法拭魅战系列:栈
推荐阅读
比来哈希表碰撞进击(Hashtable collisions as DOS attack)的话题赓续被提起,各类说话纷纷中招。本文结合PHP内核源码,聊一聊┞封种进击的道理及实现。[3] 经由过程构造Hash冲突实现各类>>>详细阅读
本文标题:Python中异常重试解决方案
地址:http://www.17bianji.com/lsqh/35522.html
1/2 1