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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top