有时我想要一个由工作线程不断更新的类,它在创建时会产生。基本上是这样的:
class MyWidget:
def __init__(self):
self.blah = None
self.thread = MyThread(self)
self.thread.start()
def update(self, blah):
self.blah = blah
class MyThread(threading.Thread):
def __init__(self, widget):
self.widget = widget
def run(self):
while True:
time.sleep(1)
blah = poll()
self.widget.update(blah)
我想要一种安全的方法来设计它,以便在不再需要MyWidget
时我确定线程会死掉。上述代码的问题在于MyWidget
永远不会死亡,因为它MyThread
会保持活着状态。我可以通过将MyThread
weakref.ref
提供给MyWidget
并在引用消失时打破循环来修复此问题,但我错误地认为过去没有这样做。
我真正喜欢的是将垃圾与其他所有东西一起收集的线程。即。当它的引用图和主线程的引用图是不相交时被杀死的线程。是否有可能写出这样的野兽?他们已经存在吗?
答案 0 :(得分:1)
如果您修改MyThread
以提供stop
方法:
class MyThread(threading.Thread):
def __init__(self, widget):
self.widget = widget
self.is_running = False
super(MyThread, self).__init__()
def run(self):
self.is_running = True
while self.is_running:
time.sleep(1)
blah = poll()
self.widget.update(blah)
def stop(self):
self.is_running = False
如果您不再需要MyWidget
实例,则可以调用widget.thread.stop()
,这将终止线程并允许所有内容都为GC。