2012-09-18 19 views
5

A veces deseo una clase que se actualice continuamente mediante un hilo de trabajo que genere cuando se cree. Básicamente así:En python, ¿hay alguna manera de hacer que los hilos mueran cuando ya no hay una referencia a ellos?

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) 

quiero una manera segura para el diseño de este modo que estoy seguro de que el hilo se muere cuando el MyWidget ya no se necesita. El problema con el código anterior es que el MyWidget nunca morirá porque se mantiene vivo con el MyThread. Puedo solucionarlo dando el MyThread a weakref.ref al MyWidget y rompiendo el ciclo cuando la referencia muere, pero he cometido el error de no hacer esto en el pasado.

Lo que realmente me gustaría son los hilos que recogen la basura junto con todo lo demás. es decir. Un hilo que se elimina cuando el gráfico de referencia y el gráfico de referencia del hilo principal son disjuntos. ¿Sería posible escribir tal bestia? ¿Ya existen?

Respuesta

1

Si modifica MyThread proporcionar un método 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 

Si en el punto en el que MyWidget ejemplo, ya no es necesario puede llamar widget.thread.stop(), esto va a matar el hilo y permitir que todo sea GC' re.

Cuestiones relacionadas