1. 程式人生 > 程式設計 >python超時重新請求解決方案

python超時重新請求解決方案

在應用中,有時候會 依賴第三方模組執行方法,比如呼叫某模組的上傳下載,資料庫查詢等操作的時候,如果出現網路問題或其他問題,可能有超時重新請求的情況;

目前的解決方案有

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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。