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 test(): while True: print('-------') time.sleep(0.5) if __name__ == "__main__": t = threading.Thread(target=test) t.start() print(t.isAlive()) time.sleep(5.2) t.join() time.sleep(3) print("main thread sleep finish") print(t.isAlive())
更优雅的办法:
import threading import time threadState = {} class myThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print ("开始线程:") threadState[self.ident] = True test(self.ident) print ("退出线程:") def stop(self): threadState[self.ident] = False while self.isAlive(): time.sleep(0.001) return 'stopped' def restart(self): if self.stop() == 'stopped' : self.run() def test(tid): a = 0 while True and threadState[tid]: a += 1 print('-' * 10 + str(a) + '-' * 10) time.sleep(0.5) if __name__ == "__main__": t = myThread() t.start() print(t.ident) time.sleep(5.2) t.restart()