2012-09-18 15 views
5

Bazen, oluşturulduğunda ortaya çıkan bir çalışan iş parçacığı tarafından sürekli olarak güncellenen bir sınıf istiyorum. Temelde böyle: Ben MyWidget artık gerektiğinde iplik ölür eminim kiPython'da, artık referans olmadığında ölen ipler oluşturmanın bir yolu var mı?

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) 

Ben bu tasarlamak için güvenli bir yol istiyoruz. Yukarıdaki kodla ilgili sorun, MyWidget'un MyThread tarafından canlı tutulduğu için asla ölmeyeceğidir. a weakref.ref'u MyWidget'a vererek ve referans kaybolduğunda döngüyü kırarak düzeltebilirim ama bunu geçmişte yapmayan bir hata yaptım.

Gerçekten sevdiğim şey, toplanan çöpleri başka şeylerle birlikte toplamaktır. yani. Referans grafiği ve ana dizinin referans grafiği ayrıldığında öldürülen bir iş parçacığı. Böyle bir canavarı yazmak mümkün mü? Onlar zaten var mı?

cevap

1

Bir stop yöntem sağlamak MyThread değiştirirseniz:

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 

Eğer MyWidget örneği artık widget.thread.stop() çağırabilir tabi noktada, bu konu öldürmek ve herşey GC olmasını sağlayacaktır d.

İlgili konular