zoukankan      html  css  js  c++  java
  • 快来学学优雅的库之一tenacity!!!

    简介:Tenacity是一个通用的retry库,简化为任何任务加入重试的功能。

    不懂这个库怎么用, 很简单,哦对了,可能还需要你知道装饰器就是那个@啦就够了,上菜!

    import tenacity
    
    import requests
    
    # 直接加上retry装饰器,代码抛出异常会一直重试,直到代码运行成功
    @tenacity.retry()
    def baidu():
        response = requests.get(url = 'http://www.baidu.com')
        if response.status_code == 200:
            return response.text
        raise Exception
    
    res = baidu()
    print(res)

    这里呢,我们使用requests请求了百度,并输出response,在code=200的位置上,如果code不等于200,这个程序就会被retry重试。理就是这么个理。

    够不够优雅~

    第二道菜:

    from tenacity import retry,stop_after_attempt
    
    import requests
    
    # 加上终止条件的retry
    # 重试三次之后不再重试
    @retry(stop=stop_after_attempt(3))
    def baidu():
        res = requests.get(url = 'http://www.baidu.com')
        if res.status_code == 200:
            return res.text
        raise Exception
    
    web = baidu()
    print(web)

    这次呢还是访问百度,但是加了一个条件,可以看到哈,重试三次之后不再重试,一般用于使用账号密码登录的爬虫,有的账号一天只能登录5次,超过5次就无法登录了,

    在运行程序的时候,使用retry + stop_after_attempt()简直就是用了飘柔一样的柔顺啊!!!

    第三道菜:

    from tenacity import retry , stop_after_attempt , stop_after_delay
    
    import requests
    
    # 指定5s重试间隔
    @retry(stop=stop_after_delay(5))
    def baidu():
        web = requests.get(url = 'http://www.baidu.com')
        if web.status_code == 200:
            return web.text
        raise Exception
    res = baidu()
    print(res)

    这些代码都精简的很简单了,下面直接上菜,不要停~

    from tenacity import retry , stop_after_attempt , stop_after_delay
    
    import requests
    
    # 使用'|' 连接多个条件组合使用
    
    @retry(stop=stop_after_delay(5) | stop_after_attempt(3))
    def baidu():
        web = requests.get(url = 'http://www.baidu.com')
        if web.status_code == 200:
            return web.text
        raise Exception
    res = baidu()
    print(res)
    from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed
    
    import requests
    
    # 在程序重试前固定等待时间
    @retry(wait = wait_fixed(3))
    def baidu():
        web = requests.get(url = 'http://www.baidu.com')
        if web.status_code == 200:
            return web.text
        raise Exception
    res = baidu()
    print(res)
    from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed , wait_random
    
    import requests
    
    # 在程序重试前固定等待时间
    @retry(wait = wait_random(min=1,max=2))
    def baidu():
        web = requests.get(url = 'http://www.baidu.com')
        if web.status_code == 200:
            return web.text
        raise Exception
    res = baidu()
    print(res)
    from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed , wait_random , wait_exponential
    
    import requests
    
    # 按照指定数等待时间
    @retry(wait = wait_exponential(multiplier=2,min = 3,max = 100))
    def baidu():
        web = requests.get(url = 'http://www.baidu.com')
        if web.status_code == 200:
            return web.text
        raise Exception
    res = baidu()
    print(res)
    from tenacity import retry ,retry_if_exception_type ,retry_if_result
    
    import requests
    
    # 有触发条件的retry语句
    
    @ retry(retry = retry_if_exception_type(IOError))
    def fun_1():
        print('巴拉巴拉巴拉巴拉')
        raise Exception
    
    def fun_2(value):
        return value is None
    
    @ retry(retry = retry_if_exception_type(fun_2))
    def fun_3():
        print('滴滴滴滴滴')
    
    @ retry(retry=(retry_if_result(fun_2)|retry_if_exception_type()))
    def fun_4():
        print('呼呼呼呼呼呼')
    from tenacity import retry , stop_after_attempt ,before_log ,after_log , before_sleep_log
    import logging
    
    logger = logging.getLogger(__name__)
    
    @ retry(stop = stop_after_attempt(3),before = before_log(logger,logging.DEBUG))
    def fun_1():
        raise Exception('Error')
    
    @ retry(stop = stop_after_attempt(3),after = after_log(logger,logging.DEBUG))
    def fun_2():
        raise Exception('Error')
    @ retry(stop = stop_after_attempt(3),before_sleep = before_sleep_log(logger,logging.DEBUG))
    def fun_3():
        raise Exception('Error')

    就是这么easy~~~~~~~~

    自有风云来时雨, 似有风霜沾蓑衣
  • 相关阅读:
    Async、Await
    CommandLineParser命令行解析类
    Dispose in c#
    授权oAuth
    Hadoop技术内幕1——源代码环境准备
    postgreSql——时区问题
    Linux命令3——c
    Linux命令2——b
    Linux命令1——a
    hadoop的Linux操作
  • 原文地址:https://www.cnblogs.com/meipu/p/13132002.html
Copyright © 2011-2022 走看看