python-retrying
python retrying库
def __init__(self,
stop=None, wait=None,
stop_max_attempt_number=None,
stop_max_delay=None,
wait_fixed=None,
wait_random_min=None, wait_random_max=None,
wait_incrementing_start=None, wait_incrementing_increment=None,
wait_exponential_multiplier=None, wait_exponential_max=None,
retry_on_exception=None,
retry_on_result=None,
wrap_exception=False,
stop_func=None,
wait_func=None,
wait_jitter_max=None):
self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number
self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay
self._wait_fixed = 1000 if wait_fixed is None else wait_fixed
self._wait_random_min = 0 if wait_random_min is None else wait_random_min
self._wait_random_max = 1000 if wait_random_max is None else wait_random_max
self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start
self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment
self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier
self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max
self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max
参数解释
#stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就会停止
#stop_max_delay:从被装饰的函数开始执行的时间点开始到函数成功运行结束或失败报错中止的时间点。单位:毫秒
#wait_fixed:设置在两次retrying之间的停留时间
#retry_on_exception:指定出现哪些异常的时候再去retry 例:* retry_on_exception(retry_if_io_error)
#retry_on_result:指定要在得到哪些结果再去retry
#retrying是一个python的重试包,可以用来自动重试一些可能运行失败的程序段,retrying提供一个装饰器函数retry,被装饰的函数就会在运行失败的情况下重新执行,默认只要一直报错就会不断重试。
#stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就会停止
#stop_max_delay:从被装饰的函数开始执行的时间点开始到函数成功运行结束或失败报错中止的时间点。单位:毫秒
#wait_fixed:设置在两次retrying之间的停留时间
#retry_on_exception:指定出现哪些异常的时候再去retry
#例:retry_on_exception(retry_if_io_error)
#retry_on_result:指定要在得到哪些结果再去retry
#例:retry_on_result(retry_if_result_none)
示例:
###1
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
print("just have a test")
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
print(do_something_unreliable())
###2
import time
from retrying import retry
@retry(stop_max_attempt_number=3, retry_on_result=lambda x: x is None)
def stop_after_7_attempts():
print("Stopping after 7 attempts")
time.sleep(3)
#return "ss"
return
if __name__ == '__main__':
stop_after_7_attempts()
###3
from retrying import retry
import requests
from loguru import logger
class BaseCrawler(object):
urls = []
@retry(stop_max_attempt_number=3, retry_on_result=lambda x: x is None)
def fetch(self, url, **kwargs):
try:
response = requests.get(url, **kwargs)
if response.status_code == 200:
return response.text
except requests.ConnectionError:
return
@logger.catch
def crawl(self):
"""
crawl main method
"""
for url in self.urls:
logger.info(f'fetching {url}')
html = self.fetch(url)
print('html', html)
for proxy in self.parse(html):
logger.info(f'fetched proxy {proxy.string()} from {url}')
yield proxy
@retry(stop_max_attempt_number=3, retry_on_result=lambda x: x is None)
根据实验,如果调用fetch函数,如果函数返回值不为None,fetch 函数不会按照设定继续重试,如果返回值为None ,retry 就会迫使fetch 运行指定的次数后结束
retry_on_result=lambda x: x is None 根据fetch 的函数结果判断,如果成立,fetch 就会执行stop_max_attempt_number 次
另一个测试示例:
from retrying import retry
def run2(r):
return isinstance(r, int)
@retry(retry_on_result=run2)
def run():
print("开始重试")
a = "KKSKS"
# a = 1
return a
if __name__ == '__main__':
run()
##retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出
##run2()把run() 函数的返回值作为输入值
##执行过程
#1,首席执行run() 返回值a为字符串
#2,retry 将返回值作为参数传入run2(),以其函数结果的真假作为run()函数运行的条件
#3,run2() 结果为False ,retry 促使run()继续运行,默认执行无数次

浙公网安备 33010602011771号