Sinais de manuseio em fios Python
-
26-09-2019 - |
Pergunta
Eu tenho um aplicativo encadeado escrito em python e sempre que uma interrupção é recebida via Ctrl+C Ou, às vezes, com a matança, o aplicativo pendura. Um rastreamento de pilha é apresentado a partir de um tópico, mas o aplicativo permanece em primeiro plano, e eu geralmente tenho que anteceder o fundo Ctrl+Z Então tente matá -lo.
Qual é a maneira correta de lidar com sinais e interrupções do teclado dentro de um aplicativo encadeado?
Solução
Se você definir newthread.daemon = True
Antes de iniciar cada encadeamento, os threads serão mortos automaticamente quando o encadeamento principal sair. Não é exatamente isso que você estava perguntando, mas pelo que você descreveu, parece que poderia valer a pena saber.
Outras dicas
A maneira como eu trabalhei nesse problema era fazer um módulo que pudesse manter uma lista de threads. O módulo também tinha um método que matou todos os threads nessa lista. Eu registrei este método a ser chamado quando o SIGINT
o sinal foi recebido. Por fim, criei uma classe de invólucro para Thread
Isso adicionaria automaticamente a instância criada à lista de threads.
Threading cpython: interromper Abrange o que acontece com os sinais em threads python e várias soluções para o seu problema. É uma boa leitura.
Use o Módulo de sinal e continue lendo aqui Manipuladores de sinal e log no python sobre possíveis armadilhas.
Para pegar Ctrl+C
Ações do usuário que você tem para perfurar um sinal manipulador para SIGINT
.
Dentro do manipulador de sinal notificar (Filas de mensagens ou acesso ao atributo sincronizado RLOCK) Seus threads para desligar ou o que você pretendia fazer.