Je rencontre des problèmes lorsque j'essaie de terminer un processus en cours s'exécutant sur un thread séparé.Comportement incohérent lors de la tentative de fermeture du sous-processus python s'exécutant sur un thread
Ci-dessous est le programme. WorkOne crée un sous-processus et exécute un processus long "adb logcat" qui génère des lignes de journal. Je démarre WorkOne dans main(), attendez 5 secondes et essayez de l'arrêter. pistes multiples donne plusieurs sorties
import threading
import time
import subprocess
import sys
class WorkOne(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()
self.process = subprocess.Popen(['adb','logcat'], stdout=subprocess.PIPE, stderr=sys.stdout.fileno())
def run(self):
for line in iter(self.process.stdout.readline,''):
#print line
if self.event.is_set():
self.process.terminate()
self.process.kill()
break;
print 'exited For'
def stop(self):
self.event.set()
def main():
print 'starting worker1'
worker1 = WorkOne()
worker1.start()
print 'number of threads: ' + str(threading.active_count())
time.sleep(5)
worker1.stop()
worker1.join(5)
print 'number of threads: ' + str(threading.active_count())
if __name__ == '__main__':
main()
Parfois, je reçois [A]:
starting worker1
number of threads: 2
number of threads: 2
exited For
Parfois, je reçois [B]:
starting worker1
number of threads: 2
number of threads: 1
exited For
Parfois je suis [C]:
starting worker1
number of threads: 2
number of threads: 2
Je pense que je devrais m'attendre à obtenir [B] tout le temps e. Qu'est-ce qui ne va pas ici?
Étant donné que vous définissez un délai d'expiration dans l'appel 'join()', il est possible de conserver le thread actif même s'il a été arrêté (par exemple, il attend une nouvelle ligne dans la boucle 'for'). –
On dirait que c'était le problème, déplacé le terminer et tuer les appels de la boucle for à la méthode d'arrêt et maintenant je reçois la sortie cohérente que je m'attends – Harkish