Cómo terminar el hilo de Python sin verificar la bandera continuamente

class My_Thread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): print "Starting " + self.name cmd = [ "bash", 'process.sh'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in iter(p.stdout.readline, b''): print ("-- " + line.rstrip()) print "Exiting " + self.name def stop(self): print "Trying to stop thread " self.run = False thr = My_Thread() thr.start() time.sleep(30) thr.stop() thr.join() 

Por lo tanto, tengo un hilo como el que se muestra arriba, realmente trabajo en windows y process.sh es un script bash que se ejecuta en cygwin y toma alrededor de 5 minutos para finalizar la ejecución, por lo que no es un bucle es algo de simulación.

Quiero crear la función stop () en esta clase para poder terminar el script inmediatamente cuando lo desee. después de la terminación no espero ningún resultado útil de la secuencia de comandos process.sh

por favor, puede sugerir cualquier método, si es posible, por favor dé una pequeña explicación también

Para su ejemplo en particular, probablemente sea más fácil terminar el hilo terminando el subproceso que genera utilizando el Popen terminate() del objeto Popen

 class My_Thread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.process = None def run(self): print "Starting " + self.name cmd = [ "bash", 'process.sh'] self.process = p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in iter(p.stdout.readline, b''): print ("-- " + line.rstrip()) print "Exiting " + self.name def stop(self): print "Trying to stop thread " if self.process is not None: self.process.terminate() self.process = None thr = My_Thread() thr.start() time.sleep(30) thr.stop() thr.join() 

… provocando que se envíe un SIGTERM a bash , y la próxima llamada a p.stdout.readline() para generar una excepción, que terminará el subproceso.

Los hilos de Python no son fáciles de eliminar, puede utilizar el módulo de multiprocesamiento ( http://docs.python.org/2/library/multiprocessing.html ) que es casi el mismo y tiene la función terminate () para matar procesos.

Aquí hay un pequeño ejemplo, tomado de los documentos de python.

 >>> import multiprocessing, time, signal >>> p = multiprocessing.Process(target=time.sleep, args=(1000,)) >>> print p, p.is_alive()  False >>> p.start() >>> print p, p.is_alive()  True >>> p.terminate() >>> time.sleep(0.1) >>> print p, p.is_alive()  False >>> p.exitcode == -signal.SIGTERM True