2010-11-09 45 views
19

J'ai lu quelque part que l'exception KeyboardInterrupt est uniquement lue par le thread principal en Python. J'ai également lu que le thread principal est bloqué pendant que le thread enfant s'exécute. Cela signifie donc que CTRL + C ne peut jamais atteindre le thread enfant. J'ai essayé le code suivant:Ctrl-c c'est-à-dire KeyboardInterrupt pour tuer les threads dans 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) 

Dans ce cas, il n'y a pas d'effet de CTRL +C sur l'exécution. C'est comme si elle n'était pas capable d'écouter l'interruption. Est-ce que je comprends cela de la mauvaise façon? Y at-il un autre moyen de tuer le fil en utilisant CTRL + C?

+0

Voir http://stackoverflow.com/questions/323972/is-there -tout-le-chemin-pour-tuer-un-thread-en-python –

+5

Votre thread principal n'est pas bloqué parce que vous démarrez un autre thread. Quel serait le point de fils si c'était vrai? C'est parce que vous appelez thread1.join(), qui bloque jusqu'à ce que thread1 soit terminé. – Falmarri

Répondre

9

Le problème ici est que vous utilisez thread1.join(), ce qui obligera votre programme à attendre la fin de ce thread pour continuer.

Les signaux seront toujours pris par le processus principal, car c'est celui qui reçoit les signaux, c'est le processus qui a des threads.

En le faisant comme vous le montrez, vous exécutez une application «normale», sans fonctionnalités de thread, lorsque vous démarrez 1 thread et attendez qu'il se termine pour continuer.

12

Si vous voulez avoir thread principal pour recevoir le CTRL +C Signal tout en se joignant, il peut être fait en ajoutant délai à join() appel.

Ce qui suit semble fonctionner (ne pas oublier d'ajouter daemon=True si vous voulez mettre fin principal en fait):

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