最近处理一个线程中的函数超时问题.
函数里面有一个地方可能会卡死,我们需要去判断这个是不是卡死了,并做出相应的应对方案.
最开始想的是在函数上增加一个装饰器,使其在超时时抛出异常,然后在其他地方捕获这个异常,并处理.
查询了一些前人的方案,写出的结果有两种.
方案一:使用threading的timer定时器,代码如下:
from threading import timer
deftime_limit(interval):defwraps(func):deftime_out():raiseRuntimeError()def deco(*args, **kwargs):
timer=Timer(interval, time_out)
timer.start()
res= func(*args, **kwargs)
timer.cancel()returnresreturndecoreturn wraps
这个程序,在很多网页上看到了,使用方式,在需要监控的函数上写@time_limit(5),即可定时5秒报错.经过测试,觉得没什么用.
粗略看来,运行一下确实在程序超过interval规定的时间后抛出了RuntimeError.但是由于timer是另开的一个线程,所以这个异常别人获取不到,只有在本线程里处理才有用.
而且卡死的函数也不会停下来.
这种处理方式仅仅适用于一些函数与定时并不密切的时候,只是在函数超时时需要做一些动作的情况.
方案二:使用signal信号量机制,代码如下:
import signal
deftime_limit(interval):defwraps(func):defhandler():raiseRuntimeError()def deco(*args, **kwargs):
signal.signal(signal.SIGALRM,