Python重试模块retrying(2)


read_a_file函数如果抛出了异常,会去retry_on_exception指向的函数去判断返回的是True还是False,如果是True则运行指定的重试次数后,抛出异常,False的话直接抛出异常。
 当时自己测试的时候网上一大堆抄来抄去的,意思是retry_on_exception指定一个函数,函数返回指定异常,会重试,不是异常会退出。真坑人啊!
 来看看获取代理的应用(仅仅是为了测试retrying模块)

# 定义一个函数用于判断返回的是否是IOError
def wraper(args):
    return isinstance(args,IOError)

class ProxyUtil:
    def get_proxies(self):
        r = requests.get('http://47.98.163.40:17000/get?country=local')
        print('正在获取')
        raise IOError
        # raise IndexError
        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

# @retry_handler(retry_time=2, retry_interval=5, retry_on_exception=[IOError,IndexError])
    @retry(stop_max_attempt_number=5,retry_on_exception=wraper)
    def retry_test(self):
        self.get_proxies()
        print('io')


这种方法只能判断单一的异常,而且扩展性不够高

# 通过返回值判断是否重试
    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
        if result =="111":
            return True


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

might_return_none()


might_return_none函数的返回值传递给retry_if_result_none的result,通过判断result,返回Treu或者None表示需要重试,重试结束后抛出RetryError,返回False表示不重试。
 扩展默认的retry装饰器:

def retry_handler(retry_time: int, retry_interval: float, retry_on_exception: [BaseException], *args, **kwargs):

def is_exception(exception: [BaseException]):
        for exp in retry_on_exception:
            if isinstance(exception,exp):
                return True
        return False
        # return isinstance(exception, retry_on_exception)

def _retry(*args, **kwargs):
        return Retrying(wait_fixed=retry_interval * 1000).fixed_sleep(*args, **kwargs)

return retry(
        wait_func=_retry,
        stop_max_attempt_number=retry_time,
        retry_on_exception=is_exception
    )

class ProxyUtil:
    def get_proxies(self):
        r = requests.get('代理地址')
        print('正在获取')
        raise IOError
        # raise IndexError
        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

@retry_handler(retry_time=2, retry_interval=5, retry_on_exception=[IOError,IndexError])
    # @retry(stop_max_attempt_number=5,retry_on_exception=wraper)
    def retry_test(self):
        self.get_proxies()
        print('io')

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6e3d2db53d6e509331ac73b0591cf626.html