Форсирование прерывания между потоками через одноэлементный объект (академический) - PullRequest
0 голосов
/ 30 сентября 2010

Я уверен, что это не очень питоническая ситуация. Но я на самом деле не использую это в каком-либо производственном коде, я просто рассматриваю, как (если?) Это может работать. Это не обязательно должно быть специфично для Python, но я бы хотел решение, которое, по крайней мере, РАБОТАЕТ в рамках Python.

По сути, у меня есть потокобезопасный одноэлементный объект, который реализует __enter__ и __exit__ (поэтому его можно использовать с with.


Singleton():
    l = threading.Lock()
    __enter__():
        l.acquire()
    __exit__():
        l.release()

В моем примере один поток получает синглтон, а внутри оператора with он входит в бесконечный цикл.


def infinite():
    with Singleton():
        while True:
            pass

Цель этого эксперимента - вывести поток infinite из его бесконечного цикла, БЕЗ уничтожения потока. В частности, с использованием объекта Singleton. Сначала я подумал об использовании исключения, вызванного из другого потока:


Singleton():
    ....
    def killMe():
        raise exception

Но это, очевидно, не вызывает исключения в другом потоке. Далее я подумал, что поскольку методы входа и выхода получают блокировку переменной класса, существует ли какой-либо метод, который можно вызвать на Lock, который заставит поток, получивший его, вызвать исключение?

Или то, что я, вероятно, сделал бы в C ++, это просто удалил this или как-то вызвал деструктор объекта из себя. Есть ли способ сделать это в Python? Я знаю, что если это возможно, это будет полная хакерская работа. Но опять же, это в основном мысленный эксперимент.

1 Ответ

1 голос
/ 30 сентября 2010

В Python есть несколько недокументированный способ вызвать исключение в другом потоке, хотя есть некоторые предостережения.См. Этот рецепт для "убиваемых нитей":

http://code.activestate.com/recipes/496960-thread2-killable-threads/

http://sebulba.wikispaces.com/recipe+thread2

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