importthreadingimporttimeimportinspectimportctypesdef_async_raise(tid, exctype):"""Raises an exception in the threads with id tid"""
if notinspect.isclass(exctype):raise TypeError("Only types can be raised (not instances)")
res=ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(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")defstop_thread(thread):
_async_raise(thread.ident, SystemExit)classTestThread(threading.Thread):defrun(self):print("begin run the child thread")whileTrue:print("sleep 1s")
time.sleep(1)if __name__ == "__main__":print("begin run main thread")
t=TestThread()
t.start()
time.sleep(3)
stop_thread(t)print("main thread end")