使用python的retrying库处理尝试多次请求

2023-11-05

功能

  1. 一般装饰器api
  2. 特定的停止条件(限制尝试次数)
  3. 特定的等待条件(每次尝试之间的指数增长的时间等待)
  4. 自定义的异常进行尝试
  5. 自定义的异常进行尝试返回结果
    最简单的一个使用方法是无论有任何异常出现,都会一直重新调用一个函数、方法,直到返回一个值
import random
from retrying import retry

@retry
def do_something_unreliable():
    if random.randint(0, 10) > 1:
        print "just have a test"
        raise IOError("Broken sauce, everything is hosed!!!111one")
    else:
        return "Awesome sauce!"

print do_something_unreliable()

运行该段代码,你会发现每次随机打印的“just have a test”这句话次数不一致
安装

简单的安装retrying:

pip install retrying

或者你也可以这样,但是你可能会后悔(没明白为什么。。。):

easy_install retrying

例子
正如你上边看到的例子,默认的行为会一直重试,没有时间等待

@retry
def never_give_up_never_surrender():
    print "Retry forever ignoring Exceptions, don't wait between retries"

骚年,不要太固执,加点限制,放弃之前,尝试几次(代码尝试几次后停止)

@retry(stop_max_attempt_number=7)
def stop_after_7_attempts():
    print "Stopping after 7 attempts"

我们没有太多的时间,所以在每个尝试需要加个时间限制(多少s后停止尝试)

@retry(stop_max_delay=10000)
def stop_after_10_s():
    print "Stopping after 10 seconds"

大多数事情并不是需要尽可能快的执行,所以加一些时间等待(每个尝试间加固定时间等待)

@retry(wait_fixed=2000)
def wait_2_s():
    print "Wait 2 second between retries"

一些最好是随机的时间等待(每个尝试随机时间等待)

@retry(wait_random_min=1000, wait_random_max=2000)
def wait_random_1_to_2_s():
    print "Randomly wait 1 to 2 seconds between retries"

再一次,在重新尝试分布式服务和其他远程端点时,很难击败指数级回退(不会翻译,大概就是每次尝试的等待时间以指数形式增长)

@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
def wait_exponential_1000():
    print "Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards"

我们有一些处理重新尝试的选项,它们会引起特定的或一般的异常,就像这里的情况一样(根据异常重试)

def retry_if_io_error(exception):
    """Return True if we should retry (in this case when it's an IOError), False otherwise"""
    return isinstance(exception, IOError)

@retry(retry_on_exception=retry_if_io_error)
def might_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)
def only_raise_retry_error_when_not_io_error():
    print "Retry forever with no wait if an IOError occurs, raise any other errors wrapped in RetryError"

我们也可以使用函数的结果来改变重新尝试的行为

def retry_if_result_none(result):
    """Return True if we should retry (in this case when result is None), False otherwise"""
    return result is None

@retry(retry_on_result=retry_if_result_none)
def might_return_none():
    print "Retry forever ignoring Exceptions with no wait if return value is None"

任何停止、等待等的组合也会被支持,使你可以自由地混合和匹配。骚男,尝试起来吧!
原文:https://pypi.org/project/retrying/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python的retrying库处理尝试多次请求 的相关文章

随机推荐

  • [Python图像处理] 二.OpenCV+Numpy库读取与修改像素

    该系列文章是讲解Python OpenCV图像处理知识 前期主要讲解图像入门 OpenCV基础用法 中期讲解图像处理的各种算法 包括图像锐化算子 图像增强技术 图像分割等 后期结合深度学习研究图像识别 图像分类应用 希望文章对您有所帮助 如
  • 恐龙酷跑(python)

    恐龙酷跑小游戏 摘要 一 引言 二 系统结构 三 实现代码 四 运行结果 五 总结和展望 摘要 论述了Python语言中Pygame库的框架结构和一些常用的该库API 使用Python库进行2D游戏开发时需要注意的事项 以及进行2D游戏开发
  • 【Docker】Docker安装telnet

    文章目录 1 概述 1 概述 在使用docker容器时 有时候里边没有安装telnet 敲vim命令时提示说 telnet command not found 这个时候就需要安装vim 可是当你敲apt get install telnet
  • error LNK2019: 无法解析的外部符号 Netbios,该符号在函数 “unsigned char * __cdecl getMACAddress(unsigned char * cons

    我已经正确的加了库 头文件也能找到了 但是还是出现这个问题 说明还是库有问题 原因是我加入的是dcmtk库 是通信有关的 所以还需要在头文件位置加上如下的代码 pragma comment lib netapi32 lib
  • 元数据编辑器--(坑集锦)

    概述 Angular中的输入输出是通过注解 Input和 Output来标识 它位于组件控制器的属性上方 输入输出针对的对象是父子组件 我借鉴的博客地址 https segmentfault com a 1190000007890167 1
  • 人像抠图学习笔记

    目录 人脸分割BiseNetV2 u2net 人脸分割BiseNetV2 宣传的 BiSeNet V2出来了 72 6 的mIOU 156FPS的速度 让分割飞起来 模型30多m TensorFlow平台的 cpu版时间80ms 人脸抠图
  • 两个排序后数组中是否存在相同数字

    因为两个数组都是排好序的 所以只要一次遍历就行了 首先设两个下标 分别初始化为两个数组的起始地址 依次向前推进 推进的规则是比较两个数组中的数字 小的那个数组的下标向前推进一步 直到任何一个数组的下标到达数组末尾时 如果这时还没碰到相同的数
  • Linux下的find指令

    一 概述 因为Linux下面一切皆文件 经常需要搜索某些文件来编写 所以对于linux来说find是一条很重要的命令 linux下面的find指令用于在目录结构中搜索文件 并执行指定的操作 它提供了相当多的查找条件 功能很强大 在不指定查找
  • 第23章组织通用管理

    组织通用管理是项目管理的关键前提和基础 它为项目管理提供思想路线和基本原则与方法 项目管理则是通用管理方法在特定场景下的具体表现 在把项目管理方法运用于实际工作的时候总会表现其通用的方法 反过来说 通用的方法又必定会支配和制约着人们对项目管
  • 理解 Linux 网络栈:Linux 网络协议栈简单总结

    1 Linux 网络路径 1 1 发送端 1 1 1 应用层 1 Socket 应用层的各种网络应用程序基本上都是通过 Linux Socket 编程接口来和内核空间的网络协议栈通信的 Linux Socket 是从 BSD Socket
  • Window10文件在另一个程序中打开无法删除

    1 打开任务管理 点详细信息 2 打开性能 gt 3 打开下方的 资源监视器 4 句柄中输入文件名 5 鼠标右键结束进程 就可以删除文件啦
  • matlab判断cell为空,问与答1:在VBA代码中如何判断单元格是否为空?

    问 如下图所示的工作表 我希望使用VBA代码将空行的背景色设置为灰色 以便于查看 即将上半部分的工作表变为下半部分的样式 我需要判断某行的单元格为空 然后将该行相应的单元格背景色设置为灰色 如何判断单元格是否为空 答 先看看实现所需效果的代
  • 普通人可以做的七个小众副业,让你告别死工资

    现在有什么副业又简单又可以赚得一定的收入呢 当然是有的 下面分享七个适合普通人操作的七个小众副业 1 手工制品 现在手工制品越来越贵 可以做的种类也很多 比如粘土 针织 滴胶 奶油 手机壳 发夹之类的 又是兴趣 又能赚钱 一举两得 可以在一
  • OPF 难解case

    14bus case 当前线路功率极限为Slmax 调整为0 89 Slmax OPF收敛 调整为0 93 1 0001 Slmax OPF不收敛 调整为1 1 Slmax OPF 收敛 其实整个计算过程中 line flow 是not a
  • 数据结构中的顺序表和链表

    目录 1 顺序表 1 1 存储结构 1 2 顺序表特点 1 3 顺序表应用场景 2 链表 2 1 存储结构 最近在复习数据结构中的线性表 下面总结一下顺序表和链表的区别 1 顺序表 线性表的顺序存储称为顺序表 顺序表使得逻辑地址连续的元素在
  • 深度学习之注意力机制详解(Attention)

    深度学习之注意力机制详解 前言 一 自注意力机制 self Attention 二 代码 前言 深度学习attention机制是对人类视觉注意力机制的仿生 本质上是一种资源分配机制 生理原理就是人类视觉注意力能够以高分辨率接收于图片上的某个
  • PCB设计误区-电容的布局布线-电源是不是必须从滤波电容进入芯片管脚(2)

    PCB设计误区 电容的布局布线 电源是不是必须从滤波电容进入芯片管脚 2
  • ubuntu root密码

    Ubuntu root用户默认是禁止的 需要手动打开才行事实上ubuntu下的所有操作都用不到root用户 由于sudo的合理使用 避免了Ubuntu root用户下误操作而产生的毁灭性问题Ubuntu root账号启用方法 其实我个人认为
  • 梅露可物语虚拟服务器,【图片】【萌新】主界面的使用方法(零基础版)【梅露可物语日服吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 那下面主要讲讲梅露可的货币们 1 钻石 钻石的主要用途有三个 一 抽抽抽 二 碎了这个钻来回复你的ap 三 战斗时候被人打败了有时可以用钻石复活 不过第三个基本是都不用的 因为两瓶元气水或两瓶勇
  • 使用python的retrying库处理尝试多次请求

    功能 一般装饰器api 特定的停止条件 限制尝试次数 特定的等待条件 每次尝试之间的指数增长的时间等待 自定义的异常进行尝试 自定义的异常进行尝试返回结果 最简单的一个使用方法是无论有任何异常出现 都会一直重新调用一个函数 方法 直到返回一