2011-09-16 20 views
14

Necesito ejecutar tantos hilos de clase Observer como elementos hay en la lista dirlist. Cuando lo ejecuto, la consola de python funciona bien."RuntimeError: thread .__ init __() no se llama" cuando subclassing threading.Thread

class Observer(Thread): 
    def run(self): 
     naptime = random.randint(1,10) 
     print(self.name + ' starting, running for %ss.' % naptime) 
     time.sleep(naptime) 
     print(self.name + ' done') 

observers = {} 
for d in dirlist: 
    observers[d] = Observer() 
    observers[d].start() 

Pero cuando trato de hacerlo desde un hilo principal que se supone para desovar los hilos de observadores que recibo errores.

class Master(Thread): 
    def __init__(self, dirlist): 
     self.dirlist = dirlist 
    def run(self): 
     observers = {} 
     for d in dirlist: 
      observers[d] = Observer() 
      observers[d].start() 
     while True: 
      time.sleep(3600) 

master_thread = Master(dirlist) 
master_thread.start() 

la llamada a Master.start resultados en:

RuntimeError: thread.__init__() not called

Esto parece extraño para mí.
No puedo entender cuál es la diferencia entre ambos casos.
¿Alguien puede encontrar una solución a mi problema?

De alguna manera el seguimiento no produce un error, y no entiendo por qué.

class Master(Thread): 
    def set(self, dirlist): 
     self.dirlist = dirlist 
    def run(self): 
     observers = {} 
     for d in dirlist: 
      observers[d] = Observer() 
      observers[d].start() 
     while True: 
      time.sleep(3600) 

master_thread = Master() 
master_thread.set(dirlist) 
master_thread.start() 
+6

¿qué tal si llamamos a Thread .__ init__ como se dice? – JBernardo

+0

Debería ser 'for d in self.dirlist:'. Tal como está, 'for d in dirlist:' se refiere a un global. Para que sea una [muestra] adecuada (http://sscce.org/), el código debe estar completo, lo que significa que debe proporcionar una implementación mínima de 'Observer', y debe ser solo un código para que pueda usarse directamente (que significa que no copie el prompt y la sangría de Python del intérprete). Edita tu pregunta para arreglar la muestra. Por último, ¿con qué versión de Python estás trabajando? – outis

Respuesta

3

error es clara, debe llamar thread.__init__():

def __init__(self, dirlist): 
    super(Master, self).__init__() 
    self.dirlist = dirlist  
+3

La llamada 'super' es incorrecta. Se supone que debes pasar la subclase. – delnan

+0

Está funcionando cuando simplemente eliminé __init__ en Master. – Nullpoet

+0

@Nullpoet, debería funcionar con la llamada 'Thread .__ init__'. Asegúrate de que no haya otro problema. Y no puedes usar el parámetro dirlist sin init. – utdemir

30
>>> master_thread.start() 
RuntimeError: thread.__init__() not called 

Asegúrese de llamar Thread.__init__() en su Master.__init__:

class Master(Thread): 
    def __init__(self, dirlist): 
     super(Master, self).__init__() 
     self.dirlist = dirlist 
+0

Todavía no funciona. – Nullpoet

+3

@Nullpoet: "Todavía no funciona" No es mucho un mensaje de error. ¡Actualiza tu pregunta para mostrar el nuevo código y el nuevo error! – SingleNegationElimination

6

Bueno, yo sé que es tarde para contestar, pero , qué diablos, soy un novato en Python, pero me estaba pasando lo mismo, así que Volví a leer el tutorial de Python y tiene algunas diferencias con lo que ambos estamos intentando, espero que ayude. lugar de esta clase

import threading 

class Master(Thread): 
def set(self, dirlist): 
    self.dirlist = dirlist 
def run(self): 
    observers = {} 
    for d in dirlist 
    ... 

acuerdo con el tutorial de Python:

class Master(threading.Thread): 

falta esta línea:

threading.Thread.__init__(self) 

por lo que terminará siendo:

import threading 

class Master(threading.Thread): 
def __init__(self, dirlist): 
    threading.Thread.__init__(self) 
    self.dirlist = dirlist 
def run(self): 
    observers = {} 
    for d in dirlist 
    ... 

y eso debería funcionar, al menos funciona para mí. Espero que haya sido útil.

Y su segundo intento por el método descrito funciona, porque no se están anulando los

init method

de Thread, por tanto, se utiliza el método init original de la clase padre se ejecuta como se supone.

Cuestiones relacionadas