В 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
сможет автоматически подняться снова через некоторое время после того, как он был пойман и обработан. Вероятно, его нужно будет вызвать либо после того, как контекст, в котором он был обработан, возвращается вызывающей стороне, либо когда он собирается сборщиком мусора. У кого-нибудь есть идеи, как этого добиться?