python超時重新請求解決方案
阿新 • • 發佈:2020-01-09
在應用中,有時候會 依賴第三方模組執行方法,比如呼叫某模組的上傳下載,資料庫查詢等操作的時候,如果出現網路問題或其他問題,可能有超時重新請求的情況;
目前的解決方案有
1. 訊號量,但不支援window;
2.多執行緒,但是 如果是大量的資料重複操作嘗試,會出現執行緒管理混亂,開啟上萬個執行緒的問題;
3.結合採用 eventlet 和 retrying模組 (eventlet 原理尚需深入研究)
下面的方法實現:超過指定時間重新嘗試某個方法
# -*- coding: utf-8 -*- import random import time import eventlet from retrying import retry eventlet.monkey_patch() class RetryTimeOutException(Exception): def __init__(self,*args,**kwargs): pass def retry_if_timeout(exception): """Return True if we should retry (in this case when it's an IOError),False otherwise""" return isinstance(exception,RetryTimeOutException) def retry_fun(retries=3,timeout_second=2): """ will retry ${retries} times when process time beyond ${timeout_second} ; :param retries: The retry times :param timeout_second: The max process time """ def retry_decor(func): @retry(stop_max_attempt_number=retries,retry_on_exception=retry_if_timeout) def decor(*args,**kwargs): print("In retry method..") pass_flag = False with eventlet.Timeout(timeout_second,False): r = func(*args,**kwargs) pass_flag = True print("Success after method.") if not pass_flag: raise RetryTimeOutException("Time out..") print("Exit from retry.") return r return decor return retry_decor def do_request(): print("begin request...") sleep_time = random.randint(1,4) print("request sleep time: %s." % sleep_time) time.sleep(sleep_time) print("end request...") return True @retry_fun(retries=3) def retry_request(): r = do_request() print(r) if __name__ == '__main__': retry_request()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。