在C#中,线程具有一种Abort
方法,该方法将在它们可能运行的任何地方引发ThreadAbortException
。 Python没有此功能,因此已实现。但是,此实现不会导致在所有异常处理结束时自动重新引发异常。
使用sys.settrace
和ThreadAbortException.__del__
进行了一些实验,均未成功。这些似乎在实现可以自动再次引发自身的异常的正确轨道上。不幸的是,一个干净的实现可能还支持将来的线程ResetAbort
方法,这对我来说有点困难。
以下是到目前为止编写的实现:
#! /usr/bin/env python3
import ctypes
import threading
PyThreadState_SetAsyncExc = ctypes.pythonapi.PyThreadState_SetAsyncExc
PyThreadState_SetAsyncExc.argtypes = ctypes.c_ulong, ctypes.py_object
PyThreadState_SetAsyncExc.restype = ctypes.c_int
def set_async_exc(thread_id, exception):
if not isinstance(thread_id, int):
raise TypeError('thread_id should be of type int')
if not issubclass(exception, BaseException):
raise TypeError('exception should be subclass of BaseException')
return PyThreadState_SetAsyncExc(thread_id, exception)
class ThreadAbortException(SystemExit):
pass
class CThread(threading.Thread):
def abort(self):
set_async_exc(self.ident, ThreadAbortException)
我的期望是ThreadAbortException
的一个实例应该能够在被捕获和处理后的某个时间自动再次升起。在处理它的上下文返回给调用者之后或由垃圾收集器收集它时,可能需要引发它。有谁知道如何做到这一点?