Python 语句执行时间控制

2018-10-20  本文已影响0人  dawsonenjoy

对于执行某些语句时,担心执行时间过长,于是需要设置最长执行时间,超时即退出,这里提出三种方案:

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

上一篇 下一篇

猜你喜欢

热点阅读