1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| def set_timeout(seconds, err_msg): def decorator(func): # 信号机制的回调函数,signal_num即为信号,frame为被信号中断那一时刻的栈帧 def signal_handler(signal_num, frame): raise TimeoutError(f"{err_msg}") def wrapper(*args, **kwargs): signal.signal(signal.SIGALRM, signal_handler) # 如果time是非0,这个函数则响应一个SIGALRM信号并在time秒后发送到该进程。 signal.alarm(seconds) try: # 若超时,此时alarm会发送信息激活回调函数signal_handler,从而引发异常终止掉try的代码块 result = func(*args, **kwargs) finally: # 假如在callback函数未执行的时候,要取消的话,那么可以使用alarm(0)来取消调用该回调函数 signal.alarm(0) return result return wraps(func)(wrapper) return decorator
|
参考文档
[1] https://www.jianshu.com/p/77b3f2554853