2011-01-06 22 views
8

Ho un'applicazione filettato scritto in Python, e ogni volta che un interrupt ricevuto tramite Ctrl +C o, a volte con kill, l'applicazione si bloccherà. Una traccia dello stack viene presentata da un thread, ma l'applicazione rimane in primo piano e in genere devo farlo in background con Ctrl + Z quindi tentare di ucciderlo.Segnali manipolazione in Python discussioni

Qual è il modo corretto di gestire i segnali e gli interrupt di tastiera all'interno di un'applicazione filettata?

risposta

13

Se si imposta newthread.daemon = True prima di iniziare ogni thread, i thread verranno automaticamente eliminati alla chiusura del thread principale. Non è esattamente quello che stavi chiedendo, ma da quello che hai descritto, sembra che valga la pena di saperlo.

+0

Quindi, suppongo, la domanda diventa: il thread principale riceve Ctrl + C e altri segnali di default? ** MODIFICA: ** Questa domanda viene data risposta al post di @shanked. –

+0

ricorda: "I thread daemon vengono interrotti bruscamente all'arresto e le loro risorse (come file aperti, transazioni di database, ecc.) Potrebbero non essere rilasciate correttamente." https://docs.python.org/2/library/threading.html e https://docs.python.org/3.4/library/threading.html – kkurian

5

Il modo in cui ho risolto questo problema era creare un modulo che potesse contenere un elenco di thread. Il modulo aveva anche un metodo che uccideva ogni thread in quell'elenco. Ho registrato questo metodo per essere chiamato quando è stato ricevuto il segnale SIGINT. Infine, ho creato una classe wrapper per Thread che aggiungerebbe automaticamente l'istanza creata all'elenco di thread.

+1

Perché non utilizzare threading.enumerate? –

+0

1) Non sapevo che esistesse. 2) Il wrapper 'Thread' esisteva già per fare altre cose che non erano rilevanti per questa domanda. Detto questo, il processo è sempre lo stesso. – unholysampler

1

Utilizzare signal module e continuare a leggere qui Signal handlers and logging in Python sulle possibili insidie.

Al fine di catturare le azioni Ctrl+C dall'utente è necessario profice un gestore signal per SIGINT.

All'interno del gestore di segnali notifica (code di messaggi o accesso di attributo sincronizzato RLock) i thread allo spegnimento, o qualsiasi cosa tu intenda fare.

+0

Non conoscevo l'interazione GIL (o non interazione) Con i segnali. Questo spiega alcuni comportamenti che ho incontrato. –