這篇文章主要為大家展示了“如何解決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()以上是“如何解決python超時重新請求問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。