retrying模块的学习

我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying.

安装

retring模块的安装很简单直接用匹配安装即可。

pip install retrying

使用

retring模块通过装饰器的形式来进行重试操作的,首先我们看一个简单的例子

from retrying import retry
@retry(stop_max_attempt_number=5,wait_random_min=1000,wait_random_max=5000)
def run():
print("开始重试")
raise NameError if __name__ == '__main__':
run()

上面的代码干了哪些事呢,首先导入retring的retry模块

然后装饰一个run函数,然后调用run,函数内容很简单就是通过raise抛出一个异常,执行该代码我们发现。程序打印了五次开始重试,最后一次抛出异常,NameError。

到这里我们可以感受到重试了,就是这么简单的代码,就完成了五次重试,同时这五次重试的间隔时间也是不同的。

如果想尝试10次就把上面的stop_max_attempt_number=5,改成10即可,到这里就可以解释retry装饰器的参数了

stop_max_attempt_number:最大重试次数,超过这个次数会停止重试,并报异常。

wait_random_min:随机等待最小时间。

wait_random_max:随机等待最大时间。

好了retry的使用就是这么简单,在需要重试的函数上面加个装饰器就好了。

关键是装饰器里的参数的使用,下面列举了retrying的参数。

如果不写参数将会一直重试.

stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为5次

@retry(stop_max_attempt_number=5)
def run():
print("开始重试")
raise NameError if __name__ == '__main__':
run()

强调总次数。

stop_max_delay:最大延迟时间,大概意思就是:如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为100毫秒

from retrying import retry

@retry(stop_max_delay=5000)
def run():
print("开始重试")
raise NameError
if __name__ == '__main__':
run()

会重试5秒钟,强调总时间。

wait_fixed:两次调用方法期间停留时长, 如果出现异常则会一直重复调用,默认 1000毫秒

from retrying import retry
@retry(wait_fixed=2000)
def run():
print("开始重试")
raise NameError if __name__ == '__main__':
run()

强调间隔时间。

wait_random_min:在两次调用方法停留时长,停留最短时间,默认为0

wait_random_max:在两次调用方法停留时长,停留最长时间,默认为1000毫秒

wait_incrementing_increment:每调用一次则会增加的时长,默认 100毫秒

wait_exponential_multiplierwait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max

retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出


from retrying import retry def run2(exception):
return isinstance(exception, ZeroDivisionError) @retry(retry_on_exception=run2)
def run():
print("开始重试")
a = 1 / 0 if __name__ == '__main__':
run()

retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出

from retrying import retry

def run2(r):
return isinstance(r, int) @retry(retry_on_result=run2)
def run():
print("开始重试")
a = 1
return a if __name__ == '__main__':
run()

wrap_exception:参数设置为True/False,如果指定的异常类型,包裹在RetryError中,会看到RetryError和程序抛的Exception error

stop_func: 每次抛出异常时都会执行的函数,如果和stop_max_delaystop_max_attempt_number配合使用,则后两者会失效

指定的stop_func会有两个参数:attempts, delay

wait_func:和stop_func用法差不多,不多描述

retrying模块的学习的更多相关文章

  1. requsets模块的学习

    requests模块的学习 使用之前 pip install requests 发起get,post,请求获取响应 response = requests.get(url,headers) # 发起g ...

  2. python模块的学习

    # time 模块 import time print(time.time()) #当前的时间挫 #time.sleep(3) #休息3秒钟,这3秒cpu不工作的 print(time.gmtime( ...

  3. Spark的Rpct模块的学习

    Spark的Rpct模块的学习 Spark的Rpc模块是1.x重构出来可,以前的代码中大量使用了akka的类,为了把akka从项目的依赖中移除,所有添加了该模块.先看下该模块的几个主要的类   使用E ...

  4. AngularJs HTML DOM、AngularJS 事件以及模块的学习(5)

    今天的基础就到了操作DOM,事件和模块的学习,其实我个人感觉学习起来AngularJS并没有想象中的那么的艰难,可能是因为这个太基础化吧,但是我们从初学开始就应该更加的自信一些,后来我可能会写一个小的 ...

  5. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  6. retrying模块的安装及使用

    安装retrying模块: win10用户在联网的情况下直接在cmd.exe里面键入"pip install retrying"  即可安装retrying模板 在网页正常浏览的过 ...

  7. Python模块——loguru日志模块简单学习

    Python loguru模块简单学习 首先安装模块:pip install logoru,然后引入模块: from loguru import logger 1.直接输出到console logge ...

  8. Request模块入门学习

    使用指令npm install --save request来安装模块,然后使用var request = require('request')完成引用. 对于GET请求,主要是获取目的url中数据. ...

  9. retrying模块的使用

    安装模块:pip3 install retrying 使用方式: 使用retrying模块提供的retry模块 通过装饰器的方式使用,让装饰器的函数反复的执行 retry可以传入参数stop_max_ ...

随机推荐

  1. C语言入门:05.scanf函数

    一.变量的内存分析 1.字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”. (1)内存以“字节为单位”

  2. mybatis 注解和xml 优缺点

    xml: 增加了xml文件,修改麻烦,条件不确定(ifelse判断),容易出错,特殊转义字符比如大于小于 注释: 复杂sql不好用,搜集sql不方便,管理不方便,修改需重新编译 #和$区别: 相同 都 ...

  3. Java之扫描目录,修改文件内容

    扫描目录下文件,修改文件中指定内容 package org.utils.tools.fileoper; import java.io.*; import java.util.ArrayList; im ...

  4. C# 多线程之Thread类

    使用System.Threading.Thread类可以创建和控制线程. 常用的构造函数有:   // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在 ...

  5. java 堆和栈二

    1.数组 整数默认初始化值0 浮点数默认初始化值0.0 布尔类型默认初始化值false 字符类型默认初始化值\u0000 [I@7852e922 [有几个代表是几维数组 I代表是Int类型 @固定格式 ...

  6. SPOJ DQUERY - D-query (莫队算法|主席树|离线树状数组)

    DQUERY - D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query ...

  7. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  8. MySQL -- 主从复制的可靠性与可用性

    主库A执行完成一个事务, 写入binlog ,记为 T1 然后传给从库B,从库B 接收该binlog ,记为 T2 从库B执行完成这个事务,记为 T3 同步延时: T3-T1 同一个事务,在 从库执行 ...

  9. 【bzoj1040】 ZJOI2008—骑士

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 (题目链接) 题意 一个基环森林,从中选出不相邻的若干个点使得这些点的点权和最大. Solut ...

  10. 前端学习 -- Css -- 否定伪类

    语法::not(.选择器) 作用:可以从已选中的元素中剔除出某些元素. <!DOCTYPE html> <html> <head> <meta charset ...