设为首页 加入收藏

TOP

Python重试模块retrying(一)
2019-07-25 14:18:15 】 浏览:203
Tags:Python 模块 retrying

工作中经常碰到的问题就是,某个方法出现了异常,重试几次。循环重复一个方法是很常见的。比如爬虫中的获取代理,对获取失败的情况进行重试。


最初的版本


import requests


class ProxyUtil:


    def __init__(self):
        self._get_proxy_count = 0


    def get_proxies(self):
        try:
            r = requests.get('代理服务器地址')
            # print('正在获取')
            # raise Exception("异常")
            # print('获取到最新代理 = %s' % r.text)
            params = dict()
            if r and r.status_code == 200:
                proxy = str(r.content, encoding='utf-8')
                params['http'] = 'http://' + proxy
                params['https'] = 'https://' + proxy
            else:
                raise Exception("获取代理失败,状态码%s"%(r.status_code))
   
            return params
        except Exception:
            if self._get_proxy_count < 5:
                print('第%d次获取代理失败,准备重试' % self._get_proxy_count)
                self._get_proxy_count += 1
                self.get_proxies()
            else:
                print('第%d次获取代理失败,退出' % self._get_proxy_count)
                self._get_proxy_count = 0
                return dict()
if __name__ == '__main__':
    proxy = ProxyUtil()
    proxy.get_proxies()



以上代码通过try...except...捕获异常,并通过一个计数器判断获取代理的次数,获取失败递归调用自己,直到达到最大次数为止。
 为了模拟失败,可以解开抛出异常的注释


下面来试试retrying模块
 安装
pip install retrying



retrying提供一个装饰器函数retry,被装饰的函数会在运行失败的情况下重新执行,默认一直报错就一直重试。


import requests
from retrying import retry


class ProxyUtil:


    def __init__(self):
        self._get_proxy_count = 0


    @retry
    def get_proxies(self):


        r = requests.get('代理地址')
        print('正在获取')
        raise Exception("异常")
        print('获取到最新代理 = %s' % r.text)
        params = dict()
        if r and r.status_code == 200:
            proxy = str(r.content, encoding='utf-8')
            params['http'] = 'http://' + proxy
            params['https'] = 'https://' + proxy


if __name__ == '__main__':
    proxy = ProxyUtil()
    proxy.get_proxies()


结果:



正在获取
 正在获取
 正在获取
...
正在获取(一直重复下去)
没有添加任何参数,默认情况下会一直重试,没有等待时间


# 设置最大重试次数
@retry(stop_max_attempt_number=5)
def get_proxies(self):
    r = requests.get('代理地址')
    print('正在获取')
    raise Exception("异常")
    print('获取到最新代理 = %s' % r.text)
    params = dict()
    if r and r.status_code == 200:
     

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python多进程与多线程编程及GIL详.. 下一篇Python通过TimedRotatingFileHand..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目