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)ifnot 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")defstop_thread(thread):
_async_raise(thread.ident, SystemExit)classTestThread(threading.Thread):defrun(self):print("begin")whileTrue:
time.sleep(0.1)print("end")deftest():print('sleep ing')
time.sleep(5)print('finished sleep')if __name__ =="__main__":
a = threading.Thread(target=test)
a.start()# t = TestThread()# t.start()# time.sleep(1)
stop_thread(a)print("stoped")