带有返回值的超时异常,可以通过创建thread类的方式来进行捕捉
import threading
import sys
import time
class Dispacher(threading.Thread):
def __init__(self, fun, args):
threading.Thread.__init__(self)
self.setDaemon(True)
self.result = None
self.error = None
self.fun = fun
self.args = args
self.start()
def run(self):
try:
self.result = self.fun(self.args)
except:
self.error = sys.exc_info()
def test_fun(i):
# time.sleep(4)
a = i*i
# b
return a
def main_fun():
c = Dispacher(test_fun, 2)
c.join(2)
if c.isAlive():
return "TimeOutError"
elif c.error:
return c.error[1]
t = c.result
return t
if __name__ == '__main__':
fun = main_fun()
print(fun)
显示结果:
test_fun 执行时间大于设置的2秒时,会抛出TimeOutError
test_fun 执行时间小于设置的2秒时,并且函数正常执行时,显示:4
test_fun 里面出现比如 “b” 时,会抛出 global name ‘b’ is not defined 的异常
signal.alarm注意两点:一是signal信号机制要在linux上才能运行; 二是signal信号在主线程中才会会起作用
](signal.alarm注意两点:一是signal信号机制要在linux上才能运行; 二是signal信号在主线程中才会会起作用)# coding=utf-8
import threading
import time
def myFunc():
time.sleep(1)
print("myFunc执行了")
if __name__ == '__main__':
t = threading.Thread(target=myFunc)
t.setDaemon(True)
t.start()
t.join(2)
print("it's over")
显示结果:
myFunc执行了
it’s over
可以看出,子线程结束时,用时1秒,没有超过主线程设定的3秒,所以主线程与子线程都被执行了