对于执行某些语句时,担心执行时间过长,于是需要设置最长执行时间,超时即退出,这里提出三种方案:
Window下
1.eventlet
pip install eventlet
安装相关模块后,即可使用,没有系统限制,举例:
import eventlet
import time
eventlet.monkey_patch()
#添加补丁
with eventlet.Timeout(2,False):
#最多执行时间为2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
print(4)
结果为:
1
2
4
可以看到with里的最后一个print因为超出2秒限制而没有输出
更多参考
https://www.cnblogs.com/Security-Darren/p/4170031.html
Linux下
2.signal
通过signal模块信号机制来控制语句执行时间,缺点是windows下信号机制不够完善,因而只能在linux、unix这类系统下使用,举例:
import time
import signal
def abc():
#最多执行时间为2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
#超时的回调函数
def myHandler(signum, frame):
print("执行超时")
exit()
signal.signal(signal.SIGALRM, myHandler)
#定时2秒,超时则执行回调函数
signal.alarm(2)
abc()
print(4)
结果为:
1
2
执行超时
上面的是程序整体执行时间控制,所以超时后不论语句在哪都不会执行
更多参考:
https://blog.csdn.net/imnisen1992/article/details/53192389
https://blog.csdn.net/jinixin/article/details/80383177?utm_source=blogxgwz4
https://www.jianshu.com/p/c8edab99173d
https://blog.csdn.net/zelinhehe/article/details/77529844
3.timeout-decorator
pip install time-decorator
安装相关模块后,即可直接调用装饰器使用,超时即报错,可以捕捉异常处理,但也基于信号机制,无法在windows下使用,举例:
import time
import timeout_decorator
@timeout_decorator.timeout(2)
def abc():
#最多执行时间为2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
try:
abc()
except:
pass
print(4)
结果为:
1
2
4
更多参考
https://www.jianshu.com/p/a7fc98c7af4d
https://www.cnblogs.com/fengmk2/archive/2008/08/30/python_tips_timeout_decorator.html
网友评论