我确信这不是一个非常pythonic的情况。但我实际上并没有在任何生产代码中使用它,我只是考虑如何(如果?)这可以工作。它不一定是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
但这显然不会引起另一个线程中的异常。我接下来想到的是,由于enter和exit方法获取了一个类变量锁,是否有任何可以在Lock
上调用的方法会导致获取它的线程抛出异常?
或者,我在C ++中可能会做的只是删除this
或以某种方式调用对象的析构函数。在python中有没有办法做到这一点?我知道,如果可能的话,这将是一个彻底的黑客工作。但同样,这基本上是一个思想实验。
答案 0 :(得分:1)
在Python中,虽然有一些警告,但在另一个线程中有一种无法记录的异常方法。请参阅此配方中的“可填充线程”:
http://code.activestate.com/recipes/496960-thread2-killable-threads/