Python retrying 重试机制的使用方法

目录
  • 循环加判断
  • retrying

我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来说一下Python中的重试方法。

循环加判断

最简单的重试方式就是在需要进行重试的代码片段上加一个循环,程序内捕获异常,如果执行成功就退出循环,执行失败就就重复执行相关代码,例如:

import requests
def req_with_retry(url):
    retry_max = 10  # 最大重试次数为10次
    for i in range(1, retry_max+1):
        try:
            print("第{}次请求".format(i))
            # 这里请求不到会抛ConnectTimeout异常
            res = requests.get(url, timeout=1)

            data = res.json()
            print("请求成功:", data)
            break
        except requests.exceptions.ConnectTimeout as e:
            continue

# 请求一个不存在的网址
req_with_retry(https://www.hahaha.cn/haha)

执行结果:

由于请求了一个不存在的网址,所以一直在重试,知道达到最大次数10次。但是这样有一定的代码侵入性,在业务逻辑上加入循环判断显得很不美观,别着急,往下看,还有更好的方法。

retrying

retrying是Python的一个第三方库,它提供一个装饰器函数retry,被装饰的业务函数就会在运行失败的条件下重新执行,默认只要报错就会一直重试,直至执行成功。

可以使用pip install retrying进行安装。

例如下面一段代码,我们使用生成随机数的大小的方式模拟业务的成功与失败,只要是生成的随机数大于2,都视为失败,就会重试,直到生成的随机数小于2:

import random
from retrying import retry

@retry
def random_with_retry():
    if random.randint(0, 10) > 2:
        print("大于2,重试...")
        raise Exception("大于2")
    print("小于2,成功!")
random_with_retry()

运行结果如下:

retry还可以接受一些参数,下面是源码中Retrying类的初始化函数中可选的参数:

  • stop_max_attempt_number:最大重试次数,超过该次数就停止重试
  • stop_max_delay:最大延迟时间(执行这个方法重试的总时间),超过该时间就停止
  • wait_fixed:两次retrying之间的等待时间
  • wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的等待时间
  • wait_incrementing_start和wait_incrementing_increment:每调用一次增加固定时长
  • 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参数,它接收一个函数,用法如下:

# 判断异常
def is_MyError(exception):
    print("判断异常", exception)
    print(isinstance(exception, (ValueError, IOError, ConnectionError)))
    return isinstance(exception, (ValueError, IOError, ConnectionError))
@retry(retry_on_exception=is_MyError)
def random_with_retry():
    """
    随机一个0-10之前的整数,大于2抛异常,小于2成功
    :return:
    """
    if random.randint(0, 10) > 2:
        print("大于2,重试...")
        raise ValueError("大于2")
    print("小于2,成功!")
random_with_retry()

这里retry_on_exception参数的大体思想是:接收一个自定义函数is_MyError,在is_MyError函数里判断了是不是属于ValueError, IOError, ConnectionError这三种异常;random_with_retry()函数如果抛出了异常,会去函数is_MyError()判断返回的是True还是False,如果是True则继续重试,如果是False则立即停止并抛出异常。

还有retry_on_result参数,也是接收一个函数,判断业务函数返回哪些结果时需要重试,思想和retry_on_exception参数类似。
我们可以根据自己的需要进行合理的搭配这些参数,达到我们想要的效果。

到此这篇关于Python retrying 重试机制的使用方法的文章就介绍到这了,更多相关Python retrying 重试机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-09-01

python爬虫URL重试机制的实现方法(python2.7以及python3.5)

应用场景: 状态不是200的URL重试多次 代码比较简单还有部分注释 python2.7实现: # -*-coding:utf-8-*- """ ayou """ import requests def url_retry(url,num_retries=3): print("access!") try: request = requests.get(url,timeout=60) #raise_for_status(),如果

python爬虫模拟浏览器的两种方法实例分析

本文实例讲述了python爬虫模拟浏览器的两种方法.分享给大家供大家参考,具体如下: 爬虫爬取网站出现403,因为站点做了防爬虫的设置 一.Herders 属性 爬取CSDN博客 import urllib.request url = "http://blog.csdn.net/hurmishine/article/details/71708030"file = urllib.request.urlopen(url) 爬取结果 urllib.error.HTTPError: HTTP

Linux部署python爬虫脚本,并设置定时任务的方法

去年因项目需要,用python写了个爬虫.因爬到的数据需要存到生产环境的PG数据库.所以需要将脚本部署到CentOS服务器,并设置定时任务,自动启动脚本. 实施步骤如下: 1.安装pip(操作系统自带了python2.6可以直接用,但是没有pip) # 下载pip安装包 wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --

解决Python 爬虫URL中存在中文或特殊符号无法请求的问题

这种问题,初学者应该都会遇到,分享给大家做个参考! from urllib.parse import quote import string #解决请求路径中含义中文或特殊字符 url_ = quote(new_url, safe=string.printable); 以上这篇解决Python 爬虫URL中存在中文或特殊符号无法请求的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

Python爬虫:url中带字典列表参数的编码转换方法

平时见到的url参数都是key-value, 一般vlaue都是字符串类型的 如果有幸和我一样遇到字典,列表等参数,那么就幸运了 python2代码 import json from urllib import urlencode # 1. 直接将url编码 params = { "name": "Tom", "hobby": ["ball", "swimming"], "books":

windows7 32、64位下python爬虫框架scrapy环境的搭建方法

适用于python 2.7 64位安装 一.操作系统:WIN7 64位 二.python版本:2.7 64位(scrapy目前不支持3.x) 不确定位数的,看图 三.安装相关软件(可以从我的百度网盘下载:链接: https://pan.baidu.com/s/1MzHNALJcRePSoaEqBQvGAQ 提取码: xd5e ) 我配置环境的时候是直接pip install scrapy安装的,但是在过程中出现一些错误,发现是由于以下软件安装失败导致的.所以请先安装这4个相关软件再安装scrap

通过python爬虫赚钱的方法

(1)在校大学生.最好是数学或计算机相关专业,编程能力还可以的话,稍微看一下爬虫知识,主要涉及一门语言的爬虫库.html解析.内容存储等,复杂的还需要了解URL排重.模拟登录.验证码识别.多线程.代理.移动端抓取等.由于在校学生的工程经验比较少,建议找一些少量数据抓取的项目,而不要去接一些监控类的项目.或大规模抓取的项目.慢慢来,步子不要迈太大. (2)在职人员.如果你本身就是爬虫工程师,挣钱很简单.如果你不是,也不要紧.只要是做IT的,稍微学习一下爬虫应该不难.在职人员的优势是熟悉项目开发流程

python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例

python爬虫模块Beautiful Soup简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序.Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非

Python爬虫实例扒取2345天气预报

寒假里学习了一下Python爬虫,使用最简单的方法扒取需要的天气数据,对,没听错,最简单的方法.甚至没有一个函数封装.. 网址:http://tianqi.2345.com/wea_history/53892.htm 火狐中右键查看网页源代码,没有发现天气数据,因此推断网页采用的json格式数据. 右击->查看元素->网络->JS,找到了位置 用Python爬虫下载为json格式数据存储下来,代码如下: #-*- coding:utf-8 -*- import urllib2 impor

基于python 爬虫爬到含空格的url的处理方法

道友问我的一个问题,之前确实没遇见过,在此记录一下. 问题描述 在某网站主页提取url进行迭代,爬虫请求主页时没有问题,返回正常,但是在访问在主页提取到的url时出现了400状态码(400 Bad Request). 结论 先贴出结论来,如果url里有空格的话,要把空格替换成%20,也就是url编码,否则就会出现400. 解决过程 首先百度了一下400状态码什么意思: 400页面是当用户在打开网页时,返回给用户界面带有400提示符的页面.其含义是你访问的页面域名不存在或者请求错误. 主要有两种形