python 杀死线程的两种方式,,方法一:强制杀死im


方法一:强制杀死

import threadingimport timeimport inspectimport ctypesdef _async_raise(tid, exctype):    if not inspect.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:        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)        raise SystemError("PyThreadState_SetAsyncExc failed")def stop_thread(thread):    _async_raise(thread.ident, SystemExit)class TestThread(threading.Thread):    def run(self):        print("begin run the child thread")        while True:            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")

方法二:优雅杀死

# encoding:utf-8import timeimport threadingclass StoppableThread(threading.Thread):    """Thread class with a stop() method. The thread itself has to check    regularly for the stopped() condition."""    def __init__(self,  *args, **kwargs):        super(StoppableThread, self).__init__(*args, **kwargs)        self._stop_event = threading.Event()    def stop(self):        self._stop_event.set()    def stopped(self):        return self._stop_event.is_set()    def run(self):        print("begin run the child thread")        while True:            print("sleep 1s")            time.sleep(1)            if self.stopped():                # 做一些必要的收尾工作                breakif __name__ == "__main__":    print("begin run main thread")    t = StoppableThread()    t.start()    time.sleep(3)    t.stop()    print("main thread end")

python 杀死线程的两种方式

评论关闭