2012-03-02 18 views
15

tengo este código:Cómo utilizar múltiples hilos

import thread 

def print_out(m1, m2): 
    print m1 
    print m2 
    print "\n" 

for num in range(0, 10): 
    thread.start_new_thread(print_out, ('a', 'b')) 

quiero crear 10 hilos, cada hilo se ejecuta la función print_out, pero fallé. Los errores son los siguientes:

Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 

Respuesta

12

En primer lugar, se debe utilizar el módulo de mayor nivel threading y en concreto la clase Thread. El módulo thread no es lo que necesita.

Al extender este código, lo más probable es que también desee esperar a que los hilos terminen. Lo que sigue es una demostración de cómo utilizar el método join para lograr que:

import threading 

class print_out(threading.Thread): 

    def __init__ (self, m1, m2): 
     threading.Thread.__init__(self) 
     self.m1 = m1 
     self.m2 = m2 

    def run(self): 
     print self.m1 
     print self.m2 
     print "\n" 

threads = [] 
for num in range(0, 10): 
    thread = print_out('a', 'b') 
    thread.start() 
    threads.append(thread) 

for thread in threads: 
    thread.join() 
+0

'thread.join()' se utiliza para esperar hasta que finalice el hilo. y noté que si no agrego las dos últimas líneas de código: 'para hilo en hilos: thread.join()', el programa también se ejecuta bien, y cada hilo se ejecuta en 'thread.start()' según la depuración , IOW si no agrego 'time.time (0.1)', no necesito agregar el código 'thread.join()' porque el programa esperará automáticamente el hilo para finalizar su tarea en 'thread.start()', ¿no? – Searene

+0

@Mark No necesita agregar 'time.sleep (0.1)' en absoluto. Eso no es necesario. Sí, puede eliminar el código que llama a 'join' y el entorno de Python esperará a que se completen todos los hilos antes de finalizar la ejecución. Sin embargo, agregué las llamadas a 'join' porque espero que necesite, en algún momento en el futuro, saber cómo esperar a que un hilo complete su ejecución. Pero sí, simplemente puede omitir esas llamadas para 'unirse' en este sencillo ejemplo. –

2

Usted debe dejar que el hilo principal mantenerse con vida durante un tiempo. Si el hilo principal muere, también lo harán los otros hilos y, por lo tanto, no verá ningún resultado. Intente agregar time.sleep(0.1) al final del código y luego verá la salida.

Después de eso, puede echar un vistazo a thread.join() para obtener más información al respecto.

2

El otro enfoque es el uso de la clase de subprocesamiento.

instance[num]=threading.Thread(target=print_out, args=('a', 'b')) 

instance[num].start() 
Cuestiones relacionadas