2012-08-13 109 views
5

Tengo una GUI de Python que utilizo para probar varios aspectos de mi trabajo. Actualmente tengo un botón de "detener" que mata el proceso al final de cada prueba (puede haber múltiples pruebas configuradas para ejecutarse a la vez). Sin embargo, algunas pruebas tardan mucho tiempo en ejecutarse y, si necesito detener la prueba, me gustaría que se detuviera al instante. Mis pensamientos son para usar¿Cómo detengo un proceso de Python instantáneamente desde una ventana de Tkinter?

import pdb; pdb.set_trace() 
exit 

Pero no estoy seguro de cómo iba a inyectar esto en la siguiente línea de ejecución de código. es posible?

+0

¿Estás tratando de detener un proceso de pitón o un hilo pitón? –

+0

es un hilo separado. –

Respuesta

5

Si se trata de un hilo, se puede utilizar el nivel más bajo thread (o _thread en Python 3) Módulo de matar al hilo con una excepción llamando thread.exit().

Desde el documentation:

  • thread.exit(): Elevar la excepción SystemExit. Cuando no está capturado, hará que el hilo salga silenciosamente.

Un método más limpio (dependiendo de cómo su procesamiento está configurado) habría que señalar el subproceso para detener el procesamiento y salida utilizando una variable de instancia, a continuación, llamar al método join() de su hilo principal que esperar hasta el hilo sale

Ejemplo:

class MyThread(threading.Thread): 

    def __init__(self): 
     super(MyThread, self).__init__() 
     self._stop_req = False 

    def run(self): 
     while not self._stop_req: 
      pass 
      # processing 

     # clean up before exiting 

    def stop(self): 
     # triggers the threading event 
     self._stop_req = True; 

def main(): 
    # set up the processing thread 
    processing_thread = MyThread() 
    processing_thread.start() 

    # do other things 

    # stop the thread and wait for it to exit 
    processing_thread.stop() 
    processing_thread.join() 

if __name__ == "__main__": 
    main() 
+0

Este NO es un buen ejemplo del propósito de enhebrar. Evento. Esa clase es para comunicarse entre hilos utilizando el método de espera, generalmente no indica salidas. En este caso, una simple variable de instancia funcionaría bien. – Genome

+0

@Genome: actualizó la respuesta en consecuencia – pR0Ps

Cuestiones relacionadas