在python中,有没有办法让线程在不再引用它们时死掉?

时间:2012-09-18 04:41:16

标签: python multithreading

有时我想要一个由工作线程不断更新的类,它在创建时会产生。基本上是这样的:

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并在引用消失时打破循环来修复此问题,但我错误地认为过去没有这样做。

我真正喜欢的是将垃圾与其他所有东西一起收集的线程。即。当它的引用图和主线程的引用图是不相交时被杀死的线程。是否有可能写出这样的野兽?他们已经存在吗?

1 个答案:

答案 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。