Python控制函式執行時間

2022-07-05 00:12:15 字數 3378 閱讀 5513

在某個flask專案在做後端介面時需要設定超時響應,因為介面中使用爬蟲請求了多個**,響應時間時長時短。

我需要設定乙個最大響應時間,時間內如果介面爬蟲沒跑完,直接返回請求超時。

從網上了解到有兩種方法,廢話不多說直接上**。

import

requests, 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不能發揮訊號系統的功能。

訊號是程序之間通訊的方式,是一種軟體中斷。乙個程序一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。

def

set_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...