在某個flask專案在做後端介面時需要設定超時響應,因為介面中使用爬蟲請求了多個**,響應時間時長時短。
我需要設定乙個最大響應時間,時間內如果介面爬蟲沒跑完,直接返回請求超時。
從網上了解到有兩種方法,廢話不多說直接上**。
importrequests, datetime, time
import
threading
class
mythread(threading.thread):
def__init__(self, target, args=()):
"""why: 因為threading類沒有返回值,因此在此處重新定義mythread類,使執行緒擁有返回值
此方法**
"""super(mythread, self).
__init__
() self.func =target
self.args =args
defrun(self):
#接受返回值
self.result = self.func(*self.args)
defget_result(self):
#執行緒不結束,返回值為none
try:
return
self.result
except
exception:
return
none
#為了限制真實請求時間或函式執行時間的裝飾器
deflimit_decor(limit_time):
""":param limit_time: 設定最大允許執行時長,單位:秒
:return: 未超時返回被裝飾函式返回值,超時則返回 none
"""def
functions(func):
#執行操作
def run(*params):
thre_func = mythread(target=func, args=params)
#主線程結束(超出時長),則執行緒方法結束
thre_func.setdaemon(true)
thre_func.start()
#計算分段沉睡次數
sleep_num = int(limit_time // 1)
sleep_nums = round(limit_time % 1, 1)
#多次短暫沉睡並嘗試獲取返回值
for i in
range(sleep_num):
time.sleep(1)
infor =thre_func.get_result()
ifinfor:
return
infor
time.sleep(sleep_nums)
#最終返回值(不論執行緒是否已結束)
ifthre_func.get_result():
return
thre_func.get_result()
else
:
return
"請求超時"#
超時返回 可以自定義
return
run
return
functions
#介面函式
defa1():
print("
開始請求介面")
#這裡把邏輯封裝成乙個函式,使用執行緒呼叫
a_theadiing = mythread(target=a2)
a_theadiing.start()
a_theadiing.join()
#返回結果
a =a_theadiing.get_result()
print("
請求完成")
return
a@limit_decor(3) #
超時設定為3s 2s邏輯未執行完畢返回介面超時
defa2():
print("
開始執行")
time.sleep(2)
print("
執行完成")
a=2returna#
程式入口 未超時返回a的值 超時返回請求超時
if__name__ == '
__main__':
a = a1() #
呼叫介面(這裡把函式a1看做乙個介面)
print(a)
超時設定3s,執行緒呼叫函式執行2s,這裡返回a的值2。
signal負責在python程式內部處理訊號,典型的操作包括預設訊號處理函式,暫停並等待訊號,以及定時發出sigalrm等。
要注意,signal包主要是針對unix平台(比如linux, mac os),而windows核心中由於對訊號機制的支援不充分,所以在windows上的python不能發揮訊號系統的功能。
訊號是程序之間通訊的方式,是一種軟體中斷。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。
defset_timeout(num):
defwrap(func):
def handle(signum, frame): #
收到訊號 sigalrm 後的**函式,第乙個引數是訊號的數字,第二個引數是the interrupted stack frame.
raise
runtimeerror
def to_do(*args):
try:
signal.signal(signal.sigalrm, handle)
#設定訊號和**函式
signal.alarm(num) #
設定 num 秒的鬧鐘
print('
start alarm signal.')
r = func(*args)
print('
close alarm signal.')
signal.alarm(0)
#關閉鬧鐘
return
r
except
runtimeerror as e:
return
"超時啦
"return
to_do
return
wrap
@set_timeout(2) #
限時 2 秒超時
def connect(): #
要執行的函式
time.sleep(3) #
函式執行時間,寫大於2的值,可測試超時
return"完成
"if__name__ == '
__main__':
a =connect()
函式執行時間計算
在最近的工作中,遇到了需要檢視某些函式執行具體時間的需求,現在分享給大家,如果有更好的改進,大家相互交流,這裡只做拋磚引玉的作用。既然要想計算時間,那麼就必須知道如何計算時間,這裡選用的計算時間的函式為 do gettimeofday returns the time of day in a tim...
C 函式執行時間
遞迴和迴圈執行時間比較 c 計算函式執行時間system.diagnostics.stopwatch或者system.datetime.now using system using system.collections.generic using system.diagnostics using s...
C 控制方法執行時間
1.最近在專案中有個讀取檔案的方法,如果檔案過大,這個方法會長時間卡住,影響程式的執行。於是研究了一下控制方法的執行時間,如果超過某個時間,則跳出該方法的執行。demo 1 private static void main string args 2,函式執行時間 s ret,datetime.no...