[Python] 使用 signal 和 decorator 讓函式執行超過時限時中斷
- 2023.05.02
- Python
import signal # seconds: 執行時限的最大秒數 # call_if_time_out: 超過執行時限後呼叫的函數 def time_limit(seconds, call_if_time_out=None): def wrapper(func): def handler(signum, frame): raise TimeoutError() def decorator(*args, **kwargs): signal.signal(signal.SIGALRM, handler) # SIGALRM: 定時器終止時傳送給行程的訊號 signal.alarm(seconds) # 設置alarm try: res = func(*args, **kwargs) except TimeoutError as e: # 如果func裡有其他try expression可能導致無法擷取到上面raise的TimeoutError res = call_if_time_out() if call_if_time_out else e finally: signal.alarm(0) # 取消之前設置的alarm並回傳剩餘秒數 return res return decorator return wrapper @time_limit(...) def ...(...): ...
Last Updated on 2023/08/16 by A1go