Domanda

Se ho un filo in un ciclo infinito, c'è un modo per terminare quando il programma principale estremità (per esempio, quando si preme Ctrl + C )?

È stato utile?

Soluzione

Controlla questa domanda. La risposta corretta è grande spiegazione su come sospendere le discussioni nel modo giusto: Esiste un modo per uccidere un thread in Python?

Per rendere la fermata del 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 ogni volta che il programma viene bruscamente interrotta.

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

Altri suggerimenti

Se fate la vostra lavoratore discussioni demone discussioni, moriranno quando tutti i thread non demone (ad esempio il thread principale) sono usciti.

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

Utilizza la atexit modulo 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 (! Anche se inevitabilmente nel thread principale) chiamare qualsiasi funzione stop si richiedono; insieme con la possibilità di creare un filo come daemon, che ti dà gli strumenti per progettare correttamente la funzionalità del sistema è necessario.

Se si genera un thread in questo modo - myThread = Thread(target = function) - e poi fare myThread.start(); myThread.join(). Quando viene avviata CTRL-C, il filo principale non uscire perché è in attesa su tale blocco di chiamata myThread.join(). Per risolvere questo problema, è sufficiente mettere in un timeout sulla chiamata .join (). Il timeout può essere lungo quanto si desidera. Se si vuole aspettare a tempo indeterminato, appena messo in un tempo molto lungo timeout, come 99999. E 'anche buona norma fare in modo che tutti myThread.daemon = True l'uscita thread quando il thread principale (non-daemon) uscite.

Prova con consentire al sub-thread come demone-thread.

Ad esempio:

from threading import Thread

threaded = Thread(target=<your-method>)
threaded.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
threaded.start()

O (in linea):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()

Quando i vostri principali termina filo ( "per esempio, quando si preme Ctrl + C ") che altri thread uccide con istruzioni di cui sopra.

discussioni Daemon vengono uccisi ungracefully così eventuali istruzioni Finalizer non vengono eseguite. Una possibile soluzione è quella di controllo è filo conduttore è vivo invece di ciclo infinito.

es. per Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

se il thread principale è ancora in vita da un altro thread .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top