2012-09-18 5 views
5

時には、作成時に生成されるワーカースレッドによって継続的に更新されるクラスが必要です。基本的には次のように:私はMyWidgetが不要になったときに、スレッドが死ぬん確信しているようにPythonでは、もはやそれらへの参照がなくなったときにスレッドが消滅する方法はありますか?

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) 

私はこれを設計する安全な方法をしたいです。上記のコードの問題はMyWidgetMyThreadによって生きているために死ぬことはないということです。私はMyThreadweakref.refMyWidgetに与え、参照が消えるとループを解除することで修正できますが、過去にこれをやっていない間違いをしました。

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

答えて

1

あなたはstop方法を提供することMyThreadを変更する場合:

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できるようになりますがd。

関連する問題