线程模块没有停止方法,是为了安全,但是我们需要停止子线程呢。小编罗列了,可以有几种安全停止线程的方式,主要涉及的是需要将共享变量作为标志、event对象还有调用C函数接口,但是如果碰到需要去强制停止线程的方式,这就需要我们去调用C函数接口。
强制停止线程,ctypes 调用 C 函数接口
import threading
import time
import inspect
import ctypes
def _async_raise(tid, exctype):
if not inspect.isclass(exctype): # 检查exctype对象,是不是类。是类返回True,不是类返回False
exctype = type(exctype)
res=ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(thread):
_async_raise(thread.ident, SystemExit) # thread.ident 返回线程 id
def work(): # 线程函数
while True:
print('工作中')
time.sleep(0.5)
print('子线程退出')
if __name__ == "__main__":
t = threading.Thread(target=work)
t.start()
time.sleep(1)
print("主线程退出")
stop_thread(t)
# 打印返回:
"""
工作中
工作中
工作中主线程退出
"""