快来学学优雅的库之一tenacity!!!
Posted meipu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快来学学优雅的库之一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~~~~~~~~
以上是关于快来学学优雅的库之一tenacity!!!的主要内容,如果未能解决你的问题,请参考以下文章
tenacity发生异常/失败/错误时重试retry机制,Python