python装饰器函数后执行_Python装饰器限制函数运行时间超时则退出执行
實際項目中會涉及到需要對有些函數的響應時間做一些限制,如果超時就退出函數的執行,停止等待。
可以利用python中的裝飾器實現對函數執行時間的控制。
python裝飾器簡單來說可以在不改變某個函數內部實現和原來調用方式的前提下對該函數增加一些附件的功能,提供了對該函數功能的擴展。
方法一. 使用 signal
# coding=utf-8
import signal
import time
def set_timeout(num, callback):
def wrap(func):
def handle(signum, frame): # 收到信號 SIGALRM 后的回調函數,第一個參數是信號的數字,第二個參數是the interrupted stack frame.
raise RuntimeError
def to_do(*args, **kwargs):
try:
signal.signal(signal.SIGALRM, handle) # 設置信號和回調函數
signal.alarm(num) # 設置 num 秒的鬧鐘
print('start alarm signal.')
r = func(*args, **kwargs)
print('close alarm signal.')
signal.alarm(0) # 關閉鬧鐘
return r
except RuntimeError as e:
callback()
return to_do
return wrap
def after_timeout(): # 超時后的處理函數
print("Time out!")
@set_timeout(2, after_timeout) # 限時 2 秒超時
def connect(): # 要執行的函數
time.sleep(3) # 函數執行時間,寫大于2的值,可測試超時
print('Finished without timeout.')
if __name__ == '__main__':
connect()
方法一中使用的signal有所限制,需要在linux系統上,并且需要在主線程中使用。方法二使用線程計時,不受此限制。
方法二. 使用Thread
# -*- coding: utf-8 -*-
from threading import Thread
import time
class TimeoutException(Exception):
pass
ThreadStop = Thread._Thread__stop
def timelimited(timeout):
def decorator(function):
def decorator2(*args,**kwargs):
class TimeLimited(Thread):
def __init__(self,_error= None,):
Thread.__init__(self)
self._error = _error
def run(self):
try:
self.result = function(*args,**kwargs)
except Exception,e:
self._error = str(e)
def _stop(self):
if self.isAlive():
ThreadStop(self)
t = TimeLimited()
t.start()
t.join(timeout)
if isinstance(t._error,TimeoutException):
t._stop()
raise TimeoutException('timeout for %s' % (repr(function)))
if t.isAlive():
t._stop()
raise TimeoutException('timeout for %s' % (repr(function)))
if t._error is None:
return t.result
return decorator2
return decorator
@timelimited(2) # 設置運行超時時間2S
def fn_1(secs):
time.sleep(secs)
return 'Finished without timeout'
def do_something_after_timeout():
print('Time out!')
if __name__ == "__main__":
try:
print(fn_1(3)) # 設置函數執行3S
except TimeoutException as e:
print(str(e))
do_something_after_timeout()
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對找一找教程網的支持。如果你想了解更多相關內容請查看下面相關鏈接
總結
以上是生活随笔為你收集整理的python装饰器函数后执行_Python装饰器限制函数运行时间超时则退出执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java类可选,java – 是否有类可
- 下一篇: linux+默认监听+目录,C# 时时监