python retrying模块的使用方法详解

前言

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

安装

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

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_multiplier和wait_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_delay、stop_max_attempt_number配合使用,则后两者会失效

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python urllib爬虫模块使用解析

    前言 网络爬虫也称为网络蜘蛛.网络机器人,抓取网络的数据.其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好.一般爬取数据的目的主要是用来做数据分析,或者公司项目做数据测试,公司业务所需数据. 而数据来源可以来自于公司内部数据,第三方平台购买的数据,还可以通过网络爬虫爬取数据.python在网络爬虫方向上有着成熟的请求.解析模块,以及强大的Scrapy网络爬虫框架. 爬虫分类 1.通用网络爬虫:搜索引擎使用,遵守robots协议(君子协议) robots协议 :网站通过r

  • python自动重试第三方包retrying模块的方法

    retrying是一个python的重试包,可以用来自动重试一些可能运行失败的程序段,retrying提供一个装饰器函数retry,被装饰的函数就会在运行失败的情况下重新执行,默认只要一直报错就会不断重试. 最近写了一个爬虫,需要连接国外的一个网站,经常出现掉线的情况,自己写了一个自动重连的代码,但感觉不够简洁... 后来就上万能的github,找到了一个第三包,基本能满足我的要求.这个第三方包就是retrying. 我的需求就是每当出现request相关异常的时候,就自动重来,上限连接10次:

  • 关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的module模块中.就这样的话,pthon提供的module还是海量的,所以除非使用某个模块里的某个函数时才会将其导入程序中.所以你使用某个函数前,要先知道他在哪个module里,然后将这个模块导入当前程序,然后才能调用这个模块里的函数. 当然 python的模块分为用户自定义的和系统提供的.Pyth

  • Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)

    Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块. 关于时间戳的几个概念 时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量. 时间元组(struct_time),包含9个元素. time.struct_time(tm_year=2017, tm_mon=10, tm_mday=1, tm_hour=14, tm_min=21, tm_sec=57, tm_wday=6, tm_yday=274, tm_isdst=0) 时间格式字

  • Python使用scipy模块实现一维卷积运算示例

    本文实例讲述了Python使用scipy模块实现一维卷积运算.分享给大家供大家参考,具体如下: 一 介绍 signal模块包含大量滤波函数.B样条插值算法等等.下面的代码演示了一维信号的卷积运算. 二 代码 import numpy as np import scipy.signal x = np.array([1,2,3]) h = np.array([4,5,6]) print(scipy.signal.convolve(x, h))#一维卷积运算 三 运行结果 [ 4 13 28 27 1

  • 使用Python完成公司名称和地址的模糊匹配的实现

    github主页 导入: >>> from fuzzywuzzy import fuzz >>> from fuzzywuzzy import process 1) >>> fuzz.ratio("this is a test", "this is a test!") out 97 >>> fuzz.partial_ratio("this is a test", "

  • Python使用random模块生成随机数操作实例详解

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的方法,现将其总结如下: 此处,利用Python中的random模块生成随机数.因此首先必须导入该模块:import random 一. 随机产生一个元素 import random #生成一个0到1的随机浮点数: 0 <= n < 1.0 print(random.random()) >&g

  • 使用python os模块复制文件到指定文件夹的方法

    复制一个文件夹的文件到指定目录下 import os import shutil import time start_time = time.time() # 需要被复制的文件夹 old_path = r'D:\zjf_workspace\001-地标.利器.服饰\004文本\json1' new_path = r'D:\zjf_workspace\001-地标.利器.服饰\004文本\json' all_list = os.listdir(old_path) for i in all_list

  • python retrying模块的使用方法详解

    前言 我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying. 安装 retrying模块的安装很简单直接用匹配安装即可. pip install retrying retring模块通过装饰器的形式来进行重试操作的,首先我们看一个简单的例子 from retrying import retry @retry(stop_max_attempt_number=

  • Python 常用模块 re 使用方法详解

    一.re模块的查找方法: 1.findall   匹配所有每一项都是列表中的一个元素 import re ret = re.findall('\d+','asd鲁班七号21313') # 正则表达式,待匹配的字符串,flag # ret = re.findall('\d','asd鲁班七号21313') # 正则表达式,待匹配的字符串,flag # print(ret) 2.search 只匹配从左到右的第一个,等到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果 impo

  • python随机模块random使用方法详解

    random随机模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序. 一.random模块常用函数介绍 random.random() - 生成一个从0.0(包含)到 1.0(不包含)之间的随机浮点数: random.uniform(a, b) - 生成一个范围为 a≤N≤b 的随机数,随机数类型是浮点数: random.randint(a, b) - 生成一个范围为 a≤N≤b 的随机数,随机数的类型是整形,注意与random.uniform(a, b)区别: random.ra

  • Python importlib模块重载使用方法详解

    模块介绍 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer). 什么是imp? 另外有一个叫做imp的模块,它提供给Python import语句机制的接口.这个模块在Python 3.4中被否决,目的就是为了只使用importlib. 了解:模块的重载 考虑到性能的原因,每个模块只被导入一次,放入字典sys.m

  • python中模块的__all__属性详解

    python模块中的__all__属性,可用于模块导入时限制,如: from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入. 若没定义,则导入模块内的所有公有属性,方法和类 # kk.py class A(): def __init__(self,name,age): self.name=name self.age=age class B(): def __init__(self,name,id): self.nam

  • 关于pip的安装,更新,卸载模块以及使用方法(详解)

    在Python的学习过程中,肯定会遇到很多安装模块的地方,可以使用easy_install安装,但是easy_install相对于pip而言,最大的缺陷就是它所安装的模块是不能够卸载的,其他功能是和pip一样的. 下面介绍一下pip的安装: 安装我总结了两个方法 1 通过下载安装文件来安装 2 通过easy_install安装 1 下载pip安装包 https://pypi.python.org/pypi/pip#downloads 1) 网页提供了两个安装包,一个是.whl的 一个是压缩包的,

  • python对于requests的封装方法详解

    由于requests是http类接口的核心,因此封装前考虑问题比较多: 1. 对多种接口类型的支持: 2. 连接异常时能够重连: 3. 并发处理的选择: 4. 使用方便,容易维护: 当前并未全部实现,后期会不断完善.重点提一下并发处理的选择:python的并发处理机制由于存在GIL的原因,实现起来并不是很理想,综合考虑多进程.多线程.协程,在不考虑大并发性能测试的前提下使用了多线程-线程池的形式实现.使用的是 concurrent.futures模块.当前仅方便支持webservice接口. #

  • python文件处理fileinput使用方法详解

    这篇文章主要介绍了python文件处理fileinput使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 fileinput模块可以对一个或多个文件中的内容进行迭代.遍历等操作,我们常用的open函数是对一个文件进行读写操作. fileinput模块的input()函数比open函数更高效和好用,体现在: input()函数生成一个迭代器,保证了在遇到大文件的读取时不会占用太大的内存. 用fileinput对文件进行循环遍历

  • python连接mongodb集群方法详解

    简单的测试用例 #!/usr/bin/python # -*- coding: UTF-8 -*- import time from pymongo import MongoClient # 连接单机 # single mongo # c = MongoClient(host="192.168.89.151", port=27017) # 连接集群 c = MongoClient('mongodb://192.168.89.151,192.168.89.152,192.168.89.1

  • Python可视化模块altair的使用详解

    目录 Altair是啥 Altair初体验 图表的保存 Altair之进阶操作 今天小编来和大家聊一下Python当中的altair可视化模块,并且通过调用该模块来绘制一些常见的图表,借助Altair,我们可以将更多的精力和时间放在理解数据本身以及数据的意义上面,从复杂的数据可视化过程中解脱出来. Altair是啥 Altair被称为是统计可视化库,因为它可以通过分类汇总.数据变换.数据交互.图形复合等方式全面地认识数据.理解和分析数据,并且其安装的过程也是十分的简单,直接通过pip命令来执行,

随机推荐