重试

retrying的Python项目详细描述


https://travis-ci.org/rholder/retrying.png?branch=masterhttps://badge.fury.io/py/retrying.pnghttps://pypip.in/d/retrying/badge.png

重试是一个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"

还支持停止、等待等任何组合,使您可以自由混合和匹配。

贡献

  1. 检查打开的问题或打开一个新的问题,开始围绕功能想法或错误的讨论。
  2. 在github上分叉the repository,开始对master分支(或其分支)进行更改。
  3. 编写一个测试,显示错误已修复或功能按预期工作。
  4. 发送一个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支持

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐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请求