Questo dovrebbe essere molto semplice e sono molto sorpreso di non essere stato in grado di trovare le risposte a queste domande già su StackOverflow.Gestione del segnale in Python multi-thread
Ho un programma simile a un demone che deve rispondere ai segnali SIGTERM e SIGINT per funzionare bene con upstart. Ho letto che il modo migliore per farlo è quello di eseguire il ciclo principale del programma in un thread separato dal thread principale e lasciare che il thread principale gestisca i segnali. Quindi, quando viene ricevuto un segnale, il gestore di segnali dovrebbe dire al loop principale di uscire impostando un flag sentinella che viene regolarmente verificato nel loop principale.
Ho provato a farlo ma non funziona come mi aspettavo. Vedere il codice qui sotto:
from threading import Thread
import signal
import time
import sys
stop_requested = False
def sig_handler(signum, frame):
sys.stdout.write("handling signal: %s\n" % signum)
sys.stdout.flush()
global stop_requested
stop_requested = True
def run():
sys.stdout.write("run started\n")
sys.stdout.flush()
while not stop_requested:
time.sleep(2)
sys.stdout.write("run exited\n")
sys.stdout.flush()
signal.signal(signal.SIGTERM, sig_handler)
signal.signal(signal.SIGINT, sig_handler)
t = Thread(target=run)
t.start()
t.join()
sys.stdout.write("join completed\n")
sys.stdout.flush()
Ho provato questo in due modi seguenti:
1)
$ python main.py > output.txt&
[2] 3204
$ kill -15 3204
2)
$ python main.py
ctrl+c
In entrambi i casi mi aspetto che questo scritto all'uscita:
run started
handling signal: 15
run exited
join completed
Nel primo caso il programma si chiude, ma tutto quello che vedo è:
run started
Nel secondo caso il segnale SIGTERM viene apparentemente ignorato quando si preme CTRL + C e il programma non esce.
Cosa mi manca qui?
Provare a sostituire 't.join()' con 'mentre t.is_alive(): t.join (1)'. Il tuo thread principale si sveglia ogni secondo per verificare i segnali. – roippi
Più lettura: http://snakesthatbite.blogspot.com/2010/09/cpython-threading-interrupting.html – roippi