2009-07-27 26 views

risposta

9

Innanzitutto, quando si impostano i gestori di segnale utilizzando il modulo signal, è necessario crearli nella thread principale. Riceverai un'eccezione se proverai a crearli in un thread separato.

movimentatori segnale memorizzato tramite la funzione signal.signal() sarà sempre chiamata nel thread principale. Sulle architetture che supportano l'invio di segnali ai thread, a livello C credo che il runtime Python ignori tutti i segnali sui thread e abbia un gestore di segnale sul thread principale, che utilizza per inviare al gestore di segnale del codice Python.

La documentazione per il modulo thread afferma che l'eccezione KeyboardInterrupt (che viene normalmente attivato da SIGINT) può essere delivered to an arbitrary thread se non si ha il modulo signal a vostra disposizione, che tutti i sistemi Unix dovrebbero avere. In tal caso, viene consegnato al thread principale. Se ci si trova su un sistema senza signal, sarà necessario catturare KeyboardInterrupt nella discussione e chiamare thread.interrupt_main() per sollevarlo nuovamente nella discussione principale.

Ulteriori informazioni sono disponibili nei documenti Python per i moduli thread e signal.

+0

Interessante, ho pensato che solo il thread principale avrebbe ricevuto 'KeyboardInterrupt's. –

+0

Sì! Chissà perché non lo è. –

+1

Nella mia esperienza, e leggendo la documentazione, quando il modulo 'signal' è disponibile,' KeyboardInterrupt' viene consegnato solo al thread principale. – Miles

4

Dalla documentazione signal:

una certa cura deve essere presa se si utilizzano entrambi i segnali e thread nello stesso programma. La cosa fondamentale da ricordare nell'uso di segnali e thread simultaneamente è: eseguire sempre le operazioni signal() nel thread principale di esecuzione. Qualsiasi thread può eseguire un alarm(), getsignal(), pause(), setitimer() o getitimer(); solo il thread principale può impostare un nuovo gestore di segnale e il thread principale sarà l'unico a ricevere segnali (questo viene applicato dal modulo di segnale Python, anche se l'implementazione del thread sottostante supporta l'invio di segnali ai singoli thread). Ciò significa che i segnali non possono essere utilizzati come mezzo di comunicazione tra thread. Usa invece le serrature.

Problemi correlati