python超时重新请求解决方案
在应用中,有时候会依赖第三方模块执行方法,比如调用某模块的上传下载,数据库查询等操作的时候,如果出现网络问题或其他问题,可能有超时重新请求的情况;
目前的解决方案有
1.信号量,但不支持window;
2.多线程,但是如果是大量的数据重复操作尝试,会出现线程管理混乱,开启上万个线程的问题;
3.结合采用eventlet和retrying模块(eventlet原理尚需深入研究)
下面的方法实现:超过指定时间重新尝试某个方法
#-*-coding:utf-8-*-
importrandom
importtime
importeventlet
fromretryingimportretry
eventlet.monkey_patch()
classRetryTimeOutException(Exception):
def__init__(self,*args,**kwargs):
pass
defretry_if_timeout(exception):
"""ReturnTrueifweshouldretry(inthiscasewhenit'sanIOError),Falseotherwise"""
returnisinstance(exception,RetryTimeOutException)
defretry_fun(retries=3,timeout_second=2):
"""
willretry${retries}timeswhenprocesstimebeyond${timeout_second};
:paramretries:Theretrytimes
:paramtimeout_second:Themaxprocesstime
"""
defretry_decor(func):
@retry(stop_max_attempt_number=retries,retry_on_exception=retry_if_timeout)
defdecor(*args,**kwargs):
print("Inretrymethod..")
pass_flag=False
witheventlet.Timeout(timeout_second,False):
r=func(*args,**kwargs)
pass_flag=True
print("Successaftermethod.")
ifnotpass_flag:
raiseRetryTimeOutException("Timeout..")
print("Exitfromretry.")
returnr
returndecor
returnretry_decor
defdo_request():
print("beginrequest...")
sleep_time=random.randint(1,4)
print("requestsleeptime:%s."%sleep_time)
time.sleep(sleep_time)
print("endrequest...")
returnTrue
@retry_fun(retries=3)
defretry_request():
r=do_request()
print(r)
if__name__=='__main__':
retry_request()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。