Как автоматически повторно вызвать исключение после обработчиков - PullRequest
0 голосов
/ 10 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...