python在一个线程中杀死另外一个线程,python另外一个,python线程没有提供


python线程没有提供abort方法,所以需要我们自己实现以下杀死线程:

import threading  import inspect  import ctypes  def _async_raise(tid, exctype):    """raises the exception, performs cleanup if needed"""    if not inspect.isclass(exctype):        raise TypeError("Only types can be raised (not instances)")    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, 0)        raise SystemError("PyThreadState_SetAsyncExc failed")class Thread(threading.Thread):    def _get_my_tid(self):        """determines this (self's) thread id"""        if not self.isAlive():            raise threading.ThreadError("the thread is not active")        # do we have it cached?        if hasattr(self, "_thread_id"):            return self._thread_id        # no, look for it in the _active dict        for tid, tobj in threading._active.items():            if tobj is self:                self._thread_id = tid                return tid        raise AssertionError("could not determine the thread's id")def raise_exc(self, exctype):        """raises the given exception type in the context of this thread"""        _async_raise(self._get_my_tid(), exctype)def terminate(self):        """raises SystemExit in the context of the given thread, which should         cause the thread to exit silently (unless caught)"""        self.raise_exc(SystemExit)

使用例子:

>>> import time  >>> from thread2 import Thread  >>>  >>> def f():  ...     try:  ...         while True:  ...             time.sleep(0.1)  ...     finally:  ...         print "outta here"  ...  >>> t = Thread(target = f)  >>> t.start()  >>> t.isAlive()  True  >>> t.terminate()  >>> t.join()  outta here  >>> t.isAlive()  False 

试了一下,很不错,只是在要kill的线程中如果有time.sleep()时,好像工作不正常,没有找出真正的原因是什么。已经是很强大了。哈哈。

评论关闭