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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。