重试

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调用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如何将多种类型的用户重定向到各自的活动?