Na documentação do Python , diz:
Um encadeamento pode ser sinalizado como um "encadeamento daemon". O significado desse sinalizador é que todo o programa Python sai quando apenas os threads do daemon são deixados. O valor inicial é herdado do encadeamento de criação.
Alguém tem uma explicação mais clara do que isso significa ou um exemplo prático mostrando onde você definiria os threads daemonic
?
Esclareça isso para mim: então a única situação em que você não definiria threads daemonic
é quando você deseja que eles continuem em execução após a saída do thread principal?
fonte
None
nesse caso, mas não importa, o valor de retorno não é usado.Digamos que você esteja criando algum tipo de widget de painel. Como parte disso, você deseja que ele exiba a contagem de mensagens não lidas na sua caixa de e-mail. Então você faz um pequeno tópico que irá:
Quando o widget é iniciado, ele cria esse encadeamento, designa um daemon e o inicia. Por ser um daemon, você não precisa pensar sobre isso; quando o widget sair, o encadeamento será interrompido automaticamente.
fonte
Outros pôsteres deram alguns exemplos de situações nas quais você usaria threads daemon. Minha recomendação, no entanto, é nunca usá-los.
Não é porque eles não são úteis, mas porque existem alguns efeitos colaterais ruins que você pode experimentar se os usar. Os encadeamentos do daemon ainda podem ser executados após o tempo de execução do Python começar a destruir as coisas no encadeamento principal, causando algumas exceções bastante bizarras.
Mais informações aqui:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
Estritamente falando, você nunca precisa deles, apenas facilita a implementação em alguns casos.
fonte
logging
e esperava que, após o término do thread, todos os objetos (descritores de arquivo para cada thread / função) fossem destruídos. No final do meu programa, vi muitas saídas comoIOError: [Errno 24] Too many open files:
. Comlsof -p pid_of_program
, descobri que os FDs estavam abertos, ainda que os Thread / Functions terminassem seus trabalhos. Gambiarra? Removendo o manipulador de log no final da função. Entãodaemonic
Threads, não sãoUma maneira mais simples de pensar sobre isso, talvez: quando o retorno principal, seu processo não será encerrado se ainda houver threads que não sejam daemon em execução.
Um conselho: o desligamento limpo é fácil de se errar quando estão envolvidos threads e sincronização - se você puder evitá-lo, faça-o. Use threads daemon sempre que possível.
fonte
Chris já explicou o que são os threads do daemon, então vamos falar sobre o uso prático. Muitas implementações de conjuntos de encadeamentos usam encadeamentos daemon para trabalhadores de tarefas. Trabalhadores são threads que executam tarefas da fila de tarefas.
O trabalhador precisa continuar aguardando tarefas na fila de tarefas indefinidamente, pois não sabe quando a nova tarefa será exibida. O segmento que atribui tarefas (por exemplo, o segmento principal) sabe apenas quando as tarefas terminam. O encadeamento principal espera na fila de tarefas para ficar vazio e sai. Se os trabalhadores forem threads de usuário, ou seja, não daemon, o programa não será encerrado. Ele continuará esperando por esses trabalhadores em execução indefinidamente, mesmo que os trabalhadores não estejam fazendo nada de útil. Marque os threads do daemon dos trabalhadores e o thread principal cuidará de matá-los assim que terminar de manipular tarefas.
fonte
Citando Chris: "... quando seu programa é encerrado, qualquer encadeamento de daemon é eliminado automaticamente.". Eu acho que isso resume tudo. Você deve ter cuidado ao usá-los, pois eles terminam abruptamente quando o programa principal é executado até a conclusão.
fonte
Quando o seu segundo encadeamento não é Daemon, o encadeamento principal principal do aplicativo não pode ser encerrado porque seus critérios de saída estão sendo vinculados à saída também de encadeamentos não-Daemon. Os encadeamentos não podem ser eliminados à força em python; portanto, seu aplicativo precisará realmente aguardar o término dos encadeamentos que não sejam do Daemon. Se esse comportamento não for o que você deseja, defina seu segundo encadeamento como daemon para que ele não impeça a saída do aplicativo.
fonte