Я уверен, что это не очень питоническая ситуация. Но я на самом деле не использую это в каком-либо производственном коде, я просто рассматриваю, как (если?) Это может работать. Это не обязательно должно быть специфично для 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? Я знаю, что если это возможно, это будет полная хакерская работа. Но опять же, это в основном мысленный эксперимент.