2012-08-13 4 views
5

Ho una GUI Python che uso per testare vari aspetti del mio lavoro. Attualmente ho un pulsante "stop" che uccide il processo alla fine di ogni test (possono essere configurati più test per essere eseguiti contemporaneamente). Tuttavia, alcuni test richiedono molto tempo per essere eseguiti e, se ho bisogno di interrompere il test, vorrei che si fermasse immediatamente. I miei pensieri sono di usareCome interrompere immediatamente un processo Python da una finestra di Tkinter?

import pdb; pdb.set_trace() 
exit 

Ma non sono sicuro di come inietterei questo codice nella prossima riga di codice. È possibile?

+0

Stai cercando di fermare un processo di pitone o un filo di pitone? –

+0

è un thread separato. –

risposta

5

Se si tratta di un thread, è possibile utilizzare il modulo thread (o _thread in Python 3) di livello inferiore per eliminare il thread con un'eccezione chiamando thread.exit().

Dal documentation:

  • thread.exit(): sollevare l'eccezione SystemExit. Se non viene rilevato, ciò causerà l'uscita silenziosa del thread.

Procedimento pulitore (a seconda di come la vostra elaborazione è configurato) sarebbe per segnalare il filo per interrompere l'elaborazione e di uscita utilizzando una variabile di istanza, quindi chiamando il metodo join() dal thread principale attendere il thread esce.

Esempio:

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

Questo NON è un buon esempio dello scopo del threading.Event. Quella classe serve per comunicare tra thread usando il metodo wait, generalmente non segnalando uscite. In questo caso una semplice variabile di istanza funzionerebbe perfettamente. – Genome

+0

@Genome: aggiornata la risposta di conseguenza – pR0Ps

Problemi correlati