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が によって生き続けているため、 が死ぬことはないということですMyThreadMyThreadにaweakref.refを与えMyWidget、参照が終了したときにループを壊すことでそれを修正できますが、過去にこれを行わなかったという間違いを犯しました。

私が本当に欲しいのは、他のすべてのものと一緒にガベージコレクションを取得するスレッドです。すなわち。スレッドの参照グラフとメイン スレッドの参照グラフが切り離されている場合に強制終了されるスレッド。そのような獣を書くことは可能でしょうか?それらはすでに存在しますか?

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 に答える