重试
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调用AmazonAWSAPI? Java中的渗流 java在dao端使用逻辑不是一个好的实践吗? java Swing绘制网格。韦尔德结果 java如何设置PlusOneButton对话框的共享选项的默认文本 java如何在firebase存储中管理多个上载/下载? java Wicket在多个位置显示相同的文本 java使用j2me通过蓝牙从一个手机向另一个手机发送短信 java为什么不让DialogWait框自动关闭? java Visual Studio代码JDBC访问Derby数据库 在java中如何根据日期从文件夹中获取文件 java如何从数据库加载多个数据 java匿名类和同步以及“this” java无法使用Selenium上载文件 java多线程JAXR调用parallelStream还是Futures? 获取要编译的Netbeans Java程序 java检查二叉树是否为有效BST的函数中的“min”和“max”是什么? java有人能解释为什么这段代码只在构造函数中工作吗? java如何将多种类型的用户重定向到各自的活动?