import threading
import time
import sys
import ctypes
import inspect
def bb():
i = 1
while i < 10 * 10000:
print(i)
time.sleep(0.1)
i += 1
# if i == 10:
# print(111)
# sys.exit()
def __async_raise(thread_Id, exctype):
#在子线程内部抛出一个异常结束线程
#如果线程内执行的是unittest模块的测试用例, 由于unittest内部又异常捕获处理,所有这个结束线程
#只能结束当前正常执行的unittest的测试用例, unittest的下一个测试用例会继续执行,只有结束继续
#向unittest中添加测试用例才能使线程执行完任务,然后自动结束。
thread_Id = ctypes.c_long(thread_Id)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_Id, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_Id, None)
raise SystemError("PyThreadState_SEtAsyncExc failed")
def terminator(thread):
#结束线程
__async_raise(thread.ident, SystemExit)
if __name__ == "__main__":
# sys.exit() 同样可以退出线程,所不同的是sys.exit()只有被执行到才能退出子线程, 且只有在子
#线程内部被执行到才能结束子线程。
# terminator可以在子线程任何时候随时结束子线程
while 1:
subthread = threading.Thread(target=bb)
subthread.start()
print(subthread.is_alive())
time.sleep(2)
terminator(subthread)
time.sleep(1)
print(subthread.is_alive())
python强制结束线程的方法
最新推荐文章于 2024-07-14 11:04:05 发布