Se ho un thread in un ciclo infinito, c'è un modo per terminarlo quando termina il programma principale (ad esempio, quando premo ctrl+C
)?python: come terminare un thread quando il programma principale termina
risposta
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
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
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
Questo risponde alla domanda e funziona. L'op non ha chiesto come uscire thread in modo pulito in generale. –
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.
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
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.
'myThread.daemon = True' è una meravigliosa soluzione a questo problema. – Brannon
@Brannon '.daemon = True' non è una soluzione solida. Controlla questa discussione per una spiegazione: https://stackoverflow.com/a/20598791/5562492 –
- 1. Terminare l'esecuzione del processo con `exec` quando termina il programma
- 2. Terminare un programma Python
- 3. I thread figlio terminano quando termina il thread padre
- 4. Come eliminare l'oggetto boost boost quando termina il thread stesso?
- 5. Un thread rilascia un lucchetto quando termina?
- 6. GObject.Mainloop() thread assieme principale
- 7. Come posso terminare ncurses senza terminare il programma C++?
- 8. Come Eclipse termina un programma in esecuzione?
- 9. L'heap viene liberato quando il programma termina?
- 10. Che cos'è TExternalThread? "Impossibile terminare un thread creato esternamente" quando si termina un timer basato su thread
- 11. Cosa succede agli altri thread quando il thread principale chiama sys.exit()?
- 12. Verificare se il thread corrente è thread principale, in Python
- 13. Come far funzionare Qt quando il thread principale è occupato?
- 14. break termina il programma - C++
- 15. python: come rilevare quando il mio thread diventa orfano?
- 16. come terminare un thread dormiente in pthread?
- 17. Eccezione System.IO.IOException durante il tentativo di terminare il thread
- 18. Perché un thread supera il metodo principale in Java?
- 19. Come chiamare il metodo principale di un programma Scala dal metodo principale di un programma java?
- 20. Come terminare un programma in Perl - esci o muori?
- 21. Come terminare correttamente il programma con un codice di uscita?
- 22. Mentre il ciclo non termina quando il flag è cambiato in thread diversi
- 23. Youtube + Selenium (Python) - Come sapere quando termina il video?
- 24. Come terminare i processi secondari quando il processo padre termina in C#
- 25. Python - Impossibile interrompere il thread principale con KeyboardInterrupt
- 26. Thread Python in Python incorporato: come?
- 27. Perché affermare semplicemente di terminare un programma compilato per iPhone?
- 28. Thread.join blocca il thread principale
- 29. Come terminare un thread in un bean con scope vista?
- 30. JUnit termina i thread figlio
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
Ho modificato la mia domanda :) – rogeriopvl
In che modo nessuno ha ancora notato il punto e virgola nell'esempio di codice? Lo adorate! –