重试
retrying的Python项目详细描述
重试是一个Apache2.0许可的通用重试库,用 python,简化了向任何内容添加重试行为的任务。
最简单的用例是每当发生异常时重试flaky函数。 直到返回值。
importrandomfromretryingimportretry@retrydefdo_something_unreliable():ifrandom.randint(0,10)>1:raiseIOError("Broken sauce, everything is hosed!!!111one")else:return"Awesome sauce!"printdo_something_unreliable()
功能
- 通用装饰器API
- 指定停止条件(即按尝试次数限制)
- 指定等待条件(即尝试之间的指数后退睡眠)
- 自定义异常时重试
- 根据预期的返回结果自定义重试
安装
要重新安装,只需:
$ pip install retrying
或者,如果您必须这样做:
$ easy_install retrying
但是,你以后可能会后悔的。
示例
正如您在上面看到的,默认行为是永远重试而不等待。
@retrydefnever_give_up_never_surrender():print"Retry forever ignoring Exceptions, don't wait between retries"
让我们少坚持一点,设定一些界限,比如放弃前的尝试次数。
@retry(stop_max_attempt_number=7)defstop_after_7_attempts():print"Stopping after 7 attempts"
我们没有一整天的时间,所以让我们设定一个界限,我们应该多长时间重试的东西。
@retry(stop_max_delay=10000)defstop_after_10_s():print"Stopping after 10 seconds"
大多数事情都不希望被调查得越快越好,所以让我们在两次重试之间等待2秒。
@retry(wait_fixed=2000)defwait_2_s():print"Wait 2 second between retries"
有些事情表现最好的时候会有点随机性。
@retry(wait_random_min=1000,wait_random_max=2000)defwait_random_1_to_2_s():print"Randomly wait 1 to 2 seconds between retries"
再次重申,在重试分布式服务和其他远程端点时,很难克服指数退避。
@retry(wait_exponential_multiplier=1000,wait_exponential_max=10000)defwait_exponential_1000():print"Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards"
我们有一些处理引发特定或一般异常的重试的选项,如这里的情况。
defretry_if_io_error(exception):"""Return True if we should retry (in this case when it's an IOError), False otherwise"""returnisinstance(exception,IOError)@retry(retry_on_exception=retry_if_io_error)defmight_io_error():print"Retry forever with no wait if an IOError occurs, raise any other errors"@retry(retry_on_exception=retry_if_io_error,wrap_exception=True)defonly_raise_retry_error_when_not_io_error():print"Retry forever with no wait if an IOError occurs, raise any other errors wrapped in RetryError"
我们也可以使用函数的结果来改变重试的行为。
defretry_if_result_none(result):"""Return True if we should retry (in this case when result is None), False otherwise"""returnresultisNone@retry(retry_on_result=retry_if_result_none)defmight_return_none():print"Retry forever ignoring Exceptions with no wait if return value is None"
还支持停止、等待等任何组合,使您可以自由混合和匹配。
贡献
- 检查打开的问题或打开一个新的问题,开始围绕功能想法或错误的讨论。
- 在github上分叉the repository,开始对master分支(或其分支)进行更改。
- 编写一个测试,显示错误已修复或功能按预期工作。
- 发送一个pull请求并对维护程序进行bug操作,直到它被合并并发布。:)请确保将自己添加到AUTHORS。
历史记录
1.3.3(2014-12-14)
- 添加至少六个版本的1.7.0,因为任何较少的内容都会破坏内容
1.3.2(2014-11-09)
- 确保我们包装装饰好的功能以防止信息丢失
- 允许传入抖动值
1.3.1(2014-09-30)
- 将Requirements.txt添加到manifest.in以修复PIP安装
1.3.0(2014-09-30)
- 添加上游六个依赖项,删除嵌入的六个功能
1.2.3(2014-08-25)
- 添加对自定义等待和停止功能的支持
1.2.2(2014-06-20)
- 错误修复,在未包装异常时失败时不引发retryerror
1.2.1(2014-05-05)
- 显式传递等待类型的错误修复
1.2.0(2014-05-04)
- 当可以推断停止/等待类型时,无需显式指定它们
- 添加一些异常传播检查
1.1.0(2014-03-31)
- 通过使用Python2.6、2.7和3.2兼容性重新运行添加了正确的异常传播
- 为行为更改更新测试套件
1.0.1(2013-03-20)
- 修复了不从python异常层次结构扩展的类可能滑过的错误
- 为自定义python异常更新测试套件
1.0.0(2013-01-21)
- <第一个稳定,测试版本现在存在<
- 已应用apache 2.0许可证
- 正在清理运行的setup.py和测试套件
- 添加了Travis CI支持
推荐PyPI第三方库
- 热门话题
- java是从此类字符串中提取数据的最佳方法 filenotfoundexception Java FileOutputStream Windows/Linux java在SQLite数据库Android SDK中搜索特定字符串 java使用键值访问jsp中Map<Long,Map<String,Object>>的内容 java奇怪的HTMLeditor工具包问题 在java中使用数组只计算字母 每个应用程序都可以有自己独立的Java SDK吗 java如何将jasper报告生成的PDF文件保存在一个项目文件夹中 java BigDecimal包装器:静态字段为零 解码Base64图像时出现java IllegalArgumentException(非法的Base64字符) 将int转换为字节在Java和Actionscript中产生不同的结果 java什么使不可变对象在没有安全发布技术的情况下发布? java将字节数据写入目录 一个计算器中有多个操作的java问题 面向对象Java重写是如何工作的 带hibernate的java ClassCastException 指向最后一个对象的java对象列表 java单元测试spring项目中的Get请求