2009-05-11 13 views
12

Estoy siguiendo un tutorial sobre enhebrado simple. Dan este ejemplo y cuando trato de usarlo obtengo errores ininteligibles del intérprete. ¿Puedes decirme por qué esto no funciona? Estoy en WinXP SP3 w/Python 2.6 actualEnhebrado simple en Python 2.6 utilizando thread.start_new_thread()

import thread 

def myfunction(mystring,*args): 
    print mystring 


if __name__ == '__main__': 

    try: 

     thread.start_new_thread(myfunction,('MyStringHere',1)) 

    except Exception as errtxt: 
     print errtxt 

La ejecución de este resultado ::

excepción no controlada en el hilo iniciado por error en sys.excepthook:

excepción original era:

La información que falta en el error es en realidad falta en la salida.

+0

Funcionó para mí en 2.6 ipython – millimoose

+5

módulo de hilo es "compleja de roscar". El enhebrado simple utilizaría el módulo "enhebrado". – nosklo

Respuesta

-1

Lo he probado en Python 2.5 en un Mac, después de cambiar

except Exception as errtxt: 

a

except Exception, errtxt: 

El programa no lanzar una excepción sino que también no se imprime nada. No estoy seguro si eso es útil, pero me parece curioso ...

+0

incluso eliminando por completo la cláusula try/except, genera el mismo error –

-1

Cuando ejecuté este código en Python 2.6 funcionó, ¿es posible que ya tenga hilos abiertos que estén bloqueados en la función? Recomiendo cerrar Python por completo, verificando sus procesos en ejecución para asegurarse de que no se está ejecutando nada suyo y vuelva a intentarlo.

+0

cerré mi editor (WingIDE pro) y eliminé cualquier proceso no reconocido, mismos errores :( –

+0

intente simplemente copiar pegando el código en IDLE (el editor GUI proporcionado cuando descargue la versión de Windows de Python). Vea si todavía tiene el mismo problema. – AlbertoPL

24

El problema es que su hilo principal se ha detenido antes de que su nuevo hilo tenga tiempo de terminar. La solución es esperar en su hilo principal.

import thread, time 

def myfunction(mystring,*args): 
    print mystring 


if __name__ == '__main__': 

    try: 

     thread.start_new_thread(myfunction,('MyStringHere',1)) 

    except Exception, errtxt: 
     print errtxt 

    time.sleep(5) 

Como nota al margen, es probable que desee utilizar el módulo de roscado. Su hilo conductor esperará a que todos esos tipos de hilos que se cierre antes de salir:

from threading import Thread 

def myfunction(mystring,*args): 
    print mystring 


if __name__ == '__main__': 

    try: 
     Thread(target=myfunction, args=('MyStringHere',1)).start() 
    except Exception, errtxt: 
     print errtxt 
+0

¿Qué pasa si el hilo no sale en 5 segundos? Tiene una excepción ... – ismail

+0

@cartman me robaste la respuesta y ni siquiera te molestaste para probarlo. Las clases de subprocesos del módulo de subprocesamiento no necesitan el subproceso principal para esperar que termine ....... – Unknown

+2

¿Robó su respuesta? La respuesta es usar join() y no lo está haciendo: -) – ismail

16

Es necesario esperar hasta que el hilo termine su trabajo, así que hay que utilizar Thread.join():

from threading import Thread 

def myfunction(mystring,*args): 
    print mystring 

if __name__ == '__main__': 

    try: 
     t = Thread(None,myfunction,None,('MyStringHere',1)) 
     t.start() 
     t.join() 
    except Exception as errtxt: 
     print errtxt 
0
import thread 

def myfunction(mystring,*args): 
    print mystring 

if __name__ == '__main__': 

    try: 

     thread.start_new_thread(myfunction,('MyStringHere',1)) 

    except Exception as errtxt: 
     print errtxt 

while 1: 
    pass 

Ponga el lazo al fin, entonces le servirá.

+0

poner al bucle por fin, entonces va a funcionar para usted – user3021191

+2

me ha funcionado, gracias, pero podría dar alguna explicación para eso? –

+0

¿Cómo harás que se detenga cuando el hilo termine? – thebeancounter