为人类重试

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是最大秒数 在第一次呼叫启动后,我们仍将进行新的尝试。在

特点

安装

要安装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

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

推荐PyPI第三方库


热门话题
如何在java中调用Paint组件方法   多层次POM中的java覆盖依赖项/插件管理   java模式识别   JavaSpringMVC+Log4j2定义了Log4j2。未标识非类路径位置中的属性文件   java我们如何将IntelliJ IDEA中的maven和gradle项目与源代码浏览支持集成?   Maven mvn exec:java在Windows上工作,但不是Ubuntu 20   java在Jaxb2Marshaller上使用带有packagesToScan属性的JAXBElement时没有端点适配器   java删除方法和节点   java如何为某些场景创建正则表达式模式   java如何通过gridView中的intent()传递ArrayList数据。setOnItemClickListener()   java UnsupportedClassVersionError 1.7/1.5   java为什么JVM参数是http。tomcat servlet没有使用proxyHost?   java将ArrayList从字母顺序排序到最频繁/最不频繁   java动态字段列表迭代   java如何将字节转换为位?   hadoop java。mapreduce作业中的lang.NullPointerException   javasocketIO无法与Android中的LocationListener一起使用   java在卸载时清除内部存储   java池回收错误2个精灵同时碰撞到一个精灵