2010-10-28 4 views
3

Je suis en train d'exécuter le code suivant (il i un peu simplifié):Comment faire pour interrompre l'application multithread python?

def RunTests(self): 
     from threading import Thread 
     import signal 

     global keep_running 
     keep_running = True 
     signal.signal(signal.SIGINT, stop_running) 

     for i in range(0, NumThreads): 
      thread = Thread(target = foo) 
      self._threads.append(thread) 
      thread.start() 

# wait for all threads to finish 
     for t in self._threads: 
      t.join() 

def stop_running(signl, frme): 
    global keep_testing 
    keep_testing = False 
    print "Interrupted by the Master. Good by!" 
    return 0 

def foo(self): 

    global keep_testing 

    while keep_testing: 
     DO_SOME_WORK(); 

Je pense que l'utilisateur appuie sur les touches Ctrl + C, le programme imprime bien par message et interrompre. Cependant cela ne fonctionne pas. Où est le problème?

Merci

Répondre

3

Contrairement aux processus habituels, Python ne semble pas gérer les signaux de manière vraiment asynchrone. L'appel 'join()' bloque en quelque sorte le thread principal d'une manière qui l'empêche de répondre au signal. Cela m'étonne un peu car je ne vois rien dans la documentation indiquant que cela puisse/devrait arriver. La solution, cependant, est simple. Dans votre thread principal, ajoutez la boucle suivante avant d'appeler 'join()' sur les threads:

while keep_testing: 
    signal.pause() 
+1

Merci beaucoup. J'ai passé beaucoup de temps à résoudre ce problème. –

0

De l'threading docs:

Un fil peut être marqué comme un « fil démon ». La signification de ce drapeau est que tout le programme Python se ferme lorsque seuls les threads démons sont laissés. La valeur initiale est héritée du thread de création. Le drapeau peut être défini via la propriété daemon.

Vous pouvez essayer de régler thread.daemon = True avant d'appeler start() et voir si cela résout votre problème.

Questions connexes