-
通过 signal 信号处理函数
import signal
# 自定义异常类(继承自BaseException,这样Exception就捕获不到)
class TimeoutException(BaseException):
pass
# 超时信号函数
def set_timeout(seconds):
# 设置信号接收函数(signal.signal(sig,action),sig为信号,action为信号处理函数)
signal.signal(signal.SIGALRM, timeout_handler)
# 发送SIGALRM超时信号
signal.alarm(seconds)
# 信号处理函数(signum即信号编号,frame信号中断那一刻的栈帧)
def timeout_handler(signum, frame):
raise TimeoutException("执行超时异常")
主函数
def main():
try:
# 首先,注册超时警告的信号处理函数,给定超时时间为10秒
set_timeout(10)
# 然后,可以执行需要监控的代码段,譬如sql查询、复杂计算等
...
# 最后,如果在超时时间内完成上述代码段,则应该关闭定时器;如果未能在超时时间内完成上述代码,就会触发信号处理函数timeout_handler(),即抛出异常,我们可以捕获并进行进一步处理
signal.alarm(0)
except TimeoutException as e:
print(e)
-
通过eventlet (一个处理网络和并发的库)
import eventlet
# 主函数
def main():
# 设置超时函数前,必须执行这行代码,引入path
eventlet.monkey_patch()
try:
# 设置超时函数(第一个参数是超时时间10秒;第二个参数如果是True,超时则会触发异常、如果是False,则不会触发异常,但是会跳过with eventlet代码段内剩余代码,with eventlet代码段外其他代码仍会正常执行)
with eventlet.Timeout(10, True):
# 然后,可以执行需要监控的代码段,譬如sql查询、复杂计算等
...
# 其他代码,监控完成之后的代码
...
except eventlet.timeout.Timeout as e:
# except: # 或者该种方法也能捕获
print(e)