为人类重试
opnieuw的Python项目详细描述
Opnieuw公司
Opnieuw是一个通用的重试库,用Python编写,在 为了简化在同步操作中添加重试行为的任务 作为异步任务。Opnieuw易于使用。在
Opnieuw使添加健壮的重试变得容易:
- 有一个单一的重试策略,指数回退和抖动,这 使它不可能忘记添加抖动。在
- 它只有两个参数,以消除无效和 无意义的组合。在
- 参数命名清晰,以避免混淆,例如调用数 (包括初始值)和重试次数(不包括初始值 呼叫)。在
- 配置延迟的直观参数是 指数退避,Opnieuw接受最大数量的调用,并且 第一次呼叫后仍要重试的最长时间。在
- 参数名称中的时间单位是清晰的,以使修饰代码变得明显, 无需参考文档即可阅读。在
请参阅我们的announcement post,了解我们为什么要写的更多背景信息 奥普涅乌。在
示例
假设我们要解析https://tech.channable.com/atom.xml
,我们想
添加重试以处理特定的网络异常。我们可以在我们的
网络处理程序如下:
importrequestsfromrequests.exceptionsimportConnectionError,HTTPErrorfromopnieuwimportretry@retry(retry_on_exceptions=(ConnectionError,HTTPError),max_calls_total=4,retry_window_after_first_call_in_seconds=60,)defget_page()->str:response=requests.get('https://tech.channable.com/atom.xml')returnresponse.text
- 在
在retry_on_exceptions
指定要对哪些异常重试。在 - 在
在max_calls_total
是修饰函数的最大次数 调用,包括初始调用。在 - 在
在retry_window_after_first_call_in_seconds
是最大秒数 在第一次呼叫启动后,我们仍将进行新的尝试。在
特点
- 通用装饰器API
- 指定重试异常(即需要重试的异常类型)
- Exponential backoff with jitter
- 预发布的流行异常列表,可以轻松扩展
安装
要安装Opnieuw,只需:
^{pr2}$更多示例
上面的简短示例提供了Opnieuw如何能够
被利用。让我们深入研究Opnieuw并在
retry_on_exceptions
要在上重试:
fromurllib.errorimportURLErrorimportrequestsfromopnieuwimportRetryException,retry@retry(retry_on_exceptions=(ConnectionError,RetryException,URLError),max_calls_total=4,retry_window_after_first_call_in_seconds=60,)defget_page()->str:response=requests.get('https://tech.channable.com/atom.xml')ifresponse.status_code!=200:raiseRetryExceptionreturnresponse.text
我们可以传递要重试的异常的名称或异常的元组
到retry_on_exceptions
。如前所述,Opnieuw的开发目的是
使之更方便地向任何任务添加重试行为。在
让我们让它更通用一点,并定义一个重试异常列表 这将触发函数的重试:
STANDARD_HTTP_EXCEPTIONS=(ConnectionError,ProtocolError,RetryException,...)@retry(retry_on_exceptions=STANDARD_HTTP_EXCEPTIONS,max_calls_total=4,retry_window_after_first_call_in_seconds=60,)defget_page()->str:response=requests.post('https://tech.channable.com/atom.xml')returnresponse.text
现在我们的重试更通用,因为在
STANDARD_HTTP_EXCEPTIONS
将重试。在
如果您想要异步任务的重试行为,那么还有一个异步重试 它们的工作方式基本相同,但对于异步任务。在
下面是上面的示例,但在异步模式下:
fromopnieuwimportretry_asyncSTANDARD_HTTP_EXCEPTIONS=(ConnectionError,EOFError,RetryException,...)@retry_async(retry_on_exceptions=STANDARD_HTTP_EXCEPTIONS,max_calls_total=4,retry_window_after_first_call_in_seconds=60,)asyncdefget_page()->str:response=requests.get('https://tech.channable.com/atom.xml')returnresponse.text
- 项目
标签: