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~~~~~~~~

    自有风云来时雨, 似有风霜沾蓑衣
  • 相关阅读:
    (引)spring学习笔记1.什么是控制反转
    Arduino 各种模块篇 步进电机 step motor 舵机 servo 直流电机 总复习
    Raspberry Pi Wireless Adaptor
    Pyramid 使用总结1
    Arduino 各种模块篇 人体红外感应模块 proximity sensor
    Pyramid 使用总结2
    Webcam Streaming Desktop Recording on Linux for ubuntu or its destros
    Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)
    Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
    转载 stepper motors
  • 原文地址:https://www.cnblogs.com/meipu/p/13132002.html
Copyright © 2011-2022 走看看