2010-04-01 36 views

risposta

35

Controllare questa domanda. La risposta corretta è grande spiegazione su come sospendere le discussioni nel modo giusto: Is there any way to kill a Thread in Python?

per far cessare filo sulla tastiera del segnale di interruzione (Ctrl + C) è possibile intercettare l'eccezione "KeyboardInterrupt" e la pulizia prima di uscire. In questo modo:

try: 
    start_thread() 
except (KeyboardInterrupt, SystemExit): 
    cleanup_stop_thread() 
    sys.exit() 

In questo modo è possibile controllare cosa fare quando il programma viene interrotto bruscamente.

È inoltre possibile utilizzare il modulo incorporato del segnale che permette di gestori di segnali di impostazione (nel caso specifico il segnale SIGINT): http://docs.python.org/library/signal.html

+0

Grazie mille per la risposta. Potrei non aver indicato correttamente la domanda. Nell'esempio fornito in quella domanda era ancora necessario eseguire la funzione stop() del thread. Quando termino un programma in modo anomalo da Ctrl + C, ciò non può accadere. Quindi, la mia domanda è un po 'come "come faccio a chiamare la funzione mythread.stop() se il flusso del thread principale è interrotto" – facha

+0

Ho modificato la mia domanda :) – rogeriopvl

+2

In che modo nessuno ha ancora notato il punto e virgola nell'esempio di codice? Lo adorate! –

65

Se effettui il tuo thread di lavoro thread demoni, moriranno quando tutta la tua i thread non demone (ad es. il thread principale) sono usciti.

http://docs.python.org/library/threading.html#threading.Thread.daemon

+2

Grazie per la risposta semplice e precisa, il threading predefinito. Lo stato del daemon di thread 'isDaemon()' è False, impostalo su True da 'setDaemon (True)'. – Tony

+1

Questo risponde alla domanda e funziona. L'op non ha chiesto come uscire thread in modo pulito in generale. –

9

Utilizza il modulo atexit della libreria standard di Python per registrare le funzioni "terminazione", che vengono chiamati (sul thread principale) su qualsiasi terminazione ragionevolmente "pulita" del thread principale, tra cui un'eccezione non rilevata come KeyboardInterrupt. Tali funzioni di terminazione possono (sebbene inevitabilmente nel thread principale!) Chiamare qualsiasi funzione stop richiesta; insieme alla possibilità di impostare un thread come daemon, che fornisce gli strumenti per progettare correttamente le funzionalità di sistema necessarie.

+0

Si noti che questo approccio ha funzionato senza richiedere thread demonizzati nelle versioni di Python precedenti alla 2.6.5, vedere la risposta a http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail- on-alcune-versioni. Questo è un peccato IMHO, dato che i thread dei daemon durante lo shutdown sono un po 'un casino prima di python 3.4 (http://bugs.python.org/issue19466). Se interrompi _e_ unisci i tuoi thread daemon nei tuoi gestori di atexit, tutto dovrebbe andare bene, al costo (probabilmente insignificante) della serializzazione del tuo thread threading. – NeilenMarais

4

Se si genera una Discussione come questa - myThread = Thread(target = function) - e quindi fare myThread.start(); myThread.join(). Quando viene avviato CTRL-C, il thread principale non viene chiuso perché è in attesa di tale chiamata di blocco myThread.join(). Per risolvere questo problema, è sufficiente inserire un timeout sulla chiamata .join(). Il timeout può essere lungo quanto desideri. Se si desidera attendere indefinitamente, è sufficiente impostare un timeout molto lungo, ad esempio 99999. È inoltre consigliabile eseguire lo myThread.daemon = True in modo che tutti i thread escano quando il thread principale (non-daemon) viene chiuso.

+0

'myThread.daemon = True' è una meravigliosa soluzione a questo problema. – Brannon

+0

@Brannon '.daemon = True' non è una soluzione solida. Controlla questa discussione per una spiegazione: https://stackoverflow.com/a/20598791/5562492 –

Problemi correlati