import threading
import time
import inspect
import ctypes
def _async_raise(tid, exctype):
"""raises the exception, performs cleanup if needed"""
tid = ctypes.c_long(tid)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(thread):
_async_raise(thread.ident, SystemExit)
def timeout(n):
def wrapper(func):
def _wrapper(*args,**kwargs):
t=threading.Thread(target=func,args=args,kwargs=kwargs)
t.start()
t.join(n)
if t.is_alive():
stop_thread(t)
return _wrapper
return wrapper
@timeout(5)
def print_time():
while True:
time.sleep(1)
print(111111111111)
print(222222222222)
print(333333333333)
print(444444444444)
print(555555555555)
print(666666666666)
if __name__ == "__main__":
print_time()
print("stoped")
while 1:
pass
线程停止方法
最新推荐文章于 2022-06-28 11:01:23 发布