Ao trabalhar com o pool de multiprocessamento do Python, o manuseio de eventos KeyboardInterrupt nem sempre é simples. Neste artigo, exploraremos como lidar com essas interrupções e garantir que os processos sejam encerrados normalmente.
O exemplo de código fornecido demonstra o desafio. Apesar de ter um bloco catch para KeyboardInterrupt, ele não é executado quando control-C é pressionado. Em vez disso, o programa trava até ser encerrado externamente.
A raiz desse problema está em um bug do Python relacionado ao bloqueio de uma condição em threading.Condition.wait(). Neste contexto, KeyboardInterrupt nunca é enviado. Como resultado, evita que a interrupção seja tratada dentro do Pool.
Uma solução para esse problema é especificar um tempo limite ao aguardar os resultados. O método map_async() com um parâmetro timeout pode ser usado em vez de map(). Essa abordagem permite que KeyboardInterrupt seja reconhecido e processado:
results = pool.map_async(slowly_square, range(40)).get(9999999)
Definindo um grande valor de tempo limite , basicamente dizemos ao Pool para continuar aguardando os resultados até ser interrompido pelo usuário.
É importante observar que existem algumas limitações para esta solução alternativa. Se o tempo limite expirar antes de todas as tarefas serem concluídas, os resultados incompletos serão descartados. Portanto, é crucial escolher um valor de tempo limite apropriado que equilibre a capacidade de resposta com o risco de resultados incompletos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3