2010-11-09 12 views
19

Leí en alguna parte que la excepción KeyboardInterrupt solo la lee el hilo principal en Python. También leí que el hilo principal está bloqueado mientras se ejecuta el hilo hijo. Entonces, ¿esto significa que CTRL + C nunca se puede llegar al subproceso secundario. He probado el siguiente código:Ctrl-c i.e. KeyboardInterrupt para matar los hilos en python

def main(): 
    try: 
     thread1.start() #thread is totally blocking e.g. while (1) 
     thread1.join() 
    except KeyboardInterrupt: 
     print "Ctrl-c pressed ..." 
     sys.exit(1) 

En este caso no hay ningún efecto de CTRL +C en la ejecución. Es como si no pudiera escuchar la interrupción. ¿Estoy entendiendo esto de la manera incorrecta? ¿Hay alguna otra manera de matar el hilo usando CTRL + C?

+0

Ver http://stackoverflow.com/questions/323972/is-there -any-way-to-kill-a-thread-in-python –

+5

Tu hilo principal no está bloqueado porque inicias otro hilo. ¿Cuál sería el sentido de los hilos si eso fuera cierto? Es porque está llamando a thread1.join(), que SÍ bloquea hasta que thread1 esté listo. – Falmarri

Respuesta

9

El problema es que está utilizando thread1.join(), lo que hará que su programa espere hasta que termine el hilo para continuar.

Las señales siempre quedarán atrapadas por el proceso principal, porque es el que recibe las señales, es el proceso que tiene subprocesos.

Haciéndolo como se muestra, básicamente está ejecutando una aplicación 'normal', sin funciones de subprocesos, al comenzar 1 hilo y esperar hasta que termine para continuar.

12

Si usted quiere tener hilo principal para recibir el CTRL +C señal mientras se unen, se puede hacer mediante la adición de tiempo de espera a join() llamada.

El siguiente parece estar funcionando (no se olvide de añadir daemon=True si quieres principal para terminar en realidad):

thread1.start() 
while True: 
    thread1.join(600) 
    if not thread1.isAlive(): 
     break 
Cuestiones relacionadas