方法一来自参考文章,
方法二是对参考文章的改进,
使用守护线程,超出时间后主线程就退出
import time
import eventlet # eventlet在python3下可用
import threading
from threading import Thread
'''
参考:https://blog.csdn.net/dcrmg/article/details/82850457
'''
# 方法一
def time_limt_demo():
eventlet.monkey_patch()
time_limit = 3 # set timeout time 3s
with eventlet.Timeout(time_limit, False):
time.sleep(60)
print('error')
print('over')
# 方法二:使用装饰器
def Time_limit(**kwargs):
timeout = kwargs["timeout"]
def decorator(func):
def decortor2(*args, **kwargs):
class time_thread(Thread):
def __init__(self):
Thread.__init__(self)
self.setDaemon(True) # 设置为守护线程
def run(self):
func(*args,**kwargs)
t = time_thread()
t.start()
t.join(timeout)
return decortor2
return decorator
@Time_limit(timeout=1)
def test():
print("Working...")
print("Test current thread name:", threading.current_thread().getName())
time.sleep(6)
print("Done!")
if __name__ == "__main__":
# time_limt_demo()
print("Main current thread name:", threading.current_thread().getName())
test()