5

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

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. 我可以通过将MyThreada提供weakref.ref给 theMyWidget并在引用死亡时打破循环来解决这个问题,但我犯了过去不这样做的错误。

我真正想要的是与其他所有东西一起收集垃圾的线程。IE。当它的参考图和主线程的参考图不相交时被杀死的线程。有可能写出这样的野兽吗?它们已经存在了吗?

4

1 回答 1

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 处理。

于 2012-09-18T05:59:31.860 回答