重试操作的最简单方法
rtr的Python项目详细描述
rtry
安装
pip3 install rtry
文档
超时
作为上下文管理器
fromrtryimporttimeout,CancelledErrortry:withtimeout(3.0):resp=requests.get("https://httpbin.org/status/200")exceptCancelledError:raiseelse:print(resp)
作为上下文管理器(静默)
fromrtryimporttimeout,CancelledErrorresp=Nonewithtimeout(3.0,exception=None):resp=requests.get("https://httpbin.org/status/200")
作为装饰工
fromrtryimporttimeout,CancelledError@timeout(3.0)deffn():resp=requests.get("https://httpbin.org/status/200")returnresptry:resp=fn()exceptCancelledError:raiseelse:print(resp)
作为参数
fromrtryimportretry,CancelledError@retry(until=lambdar:r.status_code!=200,timeout=3.0)deffn():resp=requests.get("https://httpbin.org/status/200")returnresptry:resp=fn()exceptCancelledError:raiseelse:print(resp)
重试
尝试
@retry(attempts=2)deffn():resp=requests.get("https://httpbin.org/status/500")print(resp)assertresp.status_code==200returnrespresp=fn()# <Response [500]># <Response [500]># Traceback:# AssertionError
直到
@retry(until=lambdar:r.status_code!=200,attempts=2)deffn():resp=requests.get("https://httpbin.org/status/500")print(resp)returnrespresp=fn()# <Response [500]># <Response [500]>
记录器
简单的记录器
@retry(until=lambdar:r.status_code!=200,attempts=2,logger=print)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# 1 <Response [500]> <function fn at 0x103dcd268># 2 <Response [500]> <function fn at 0x103dcd268>
自定义记录器
deflogger(attempt,result_or_exception,decorated):logging.info("Attempt: %d, Result: %s",attempt,result_or_exception)@retry(until=lambdar:r.status_code!=200,attempts=2,logger=logger)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# INFO:root:Attempt: 1, Result: <Response [500]># INFO:root:Attempt: 2, Result: <Response [500]>
延迟
常量延迟
@retry(until=lambdar:r.status_code!=200,attempts=2,delay=0.1)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 2.11
自定义延迟
frommathimportexp@retry(until=lambdar:r.status_code!=200,attempts=2,delay=exp)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 11.79
吞咽
第一次异常时失败
@retry(attempts=2,swallow=None,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
仅吞咽连接错误
fromrequests.exceptionsimportConnectionError@retry(attempts=2,swallow=ConnectionError,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# 1 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# 2 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
fromrtryimporttimeout,CancelledError@timeout(3.0)deffn():resp=requests.get("https://httpbin.org/status/200")returnresptry:resp=fn()exceptCancelledError:raiseelse:print(resp)
作为参数
fromrtryimportretry,CancelledError@retry(until=lambdar:r.status_code!=200,timeout=3.0)deffn():resp=requests.get("https://httpbin.org/status/200")returnresptry:resp=fn()exceptCancelledError:raiseelse:print(resp)
重试
尝试
@retry(attempts=2)deffn():resp=requests.get("https://httpbin.org/status/500")print(resp)assertresp.status_code==200returnrespresp=fn()# <Response [500]># <Response [500]># Traceback:# AssertionError
直到
@retry(until=lambdar:r.status_code!=200,attempts=2)deffn():resp=requests.get("https://httpbin.org/status/500")print(resp)returnrespresp=fn()# <Response [500]># <Response [500]>
记录器
简单的记录器
@retry(until=lambdar:r.status_code!=200,attempts=2,logger=print)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# 1 <Response [500]> <function fn at 0x103dcd268># 2 <Response [500]> <function fn at 0x103dcd268>
自定义记录器
deflogger(attempt,result_or_exception,decorated):logging.info("Attempt: %d, Result: %s",attempt,result_or_exception)@retry(until=lambdar:r.status_code!=200,attempts=2,logger=logger)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# INFO:root:Attempt: 1, Result: <Response [500]># INFO:root:Attempt: 2, Result: <Response [500]>
延迟
常量延迟
@retry(until=lambdar:r.status_code!=200,attempts=2,delay=0.1)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 2.11
自定义延迟
frommathimportexp@retry(until=lambdar:r.status_code!=200,attempts=2,delay=exp)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 11.79
吞咽
第一次异常时失败
@retry(attempts=2,swallow=None,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
仅吞咽连接错误
fromrequests.exceptionsimportConnectionError@retry(attempts=2,swallow=ConnectionError,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# 1 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# 2 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
@retry(until=lambdar:r.status_code!=200,attempts=2,logger=print)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# 1 <Response [500]> <function fn at 0x103dcd268># 2 <Response [500]> <function fn at 0x103dcd268>
自定义记录器
deflogger(attempt,result_or_exception,decorated):logging.info("Attempt: %d, Result: %s",attempt,result_or_exception)@retry(until=lambdar:r.status_code!=200,attempts=2,logger=logger)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespresp=fn()# INFO:root:Attempt: 1, Result: <Response [500]># INFO:root:Attempt: 2, Result: <Response [500]>
延迟
常量延迟
@retry(until=lambdar:r.status_code!=200,attempts=2,delay=0.1)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 2.11
自定义延迟
frommathimportexp@retry(until=lambdar:r.status_code!=200,attempts=2,delay=exp)deffn():resp=requests.get("https://httpbin.org/status/500")returnrespstarted_at=time()resp=fn()ended_at=time()print('Elapsed {:.2f}'.format(ended_at-started_at))# Elapsed 11.79
吞咽
第一次异常时失败
@retry(attempts=2,swallow=None,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
仅吞咽连接错误
fromrequests.exceptionsimportConnectionError@retry(attempts=2,swallow=ConnectionError,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# 1 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# 2 HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500
第一次异常时失败
@retry(attempts=2,swallow=None,logger=print)deffn():resp=requests.get("http://127.0.0.1/status/500")returnresptry:resp=fn()exceptExceptionase:print(e)# HTTPConnectionPool(host='127.0.0.1', port=80): Max retries exceeded with url: /status/500