Quais são algumas boas práticas na depuração de programas de multiprocessamento no Python?
fonte
Quais são algumas boas práticas na depuração de programas de multiprocessamento no Python?
Os verdadeiros programas Python de multiprocessamento (em oposição aos programas Python multiencadeados que precisam lidar com o temido GIL ) não são diferentes dos de qualquer outra linguagem. Todos eles têm os mesmos desafios básicos:
Embora existam métodos de desenvolvimento que tentem evitar cada um desses problemas, no final do dia você realmente precisa pensar no que está fazendo. Eu recomendo testes de estresse intensos - muito além de tudo que você acha que pode acontecer na vida real - para que você tenha uma boa chance de acessar o Windows of Opportunity e explodir no desenvolvimento, em vez de no meio de uma grande demonstração ou durante a produção.
Nós costumávamos usar arquivos de log microssegundo-timestamped e, em seguida, criou um log aplicativo de visualização com código de cores para que pudéssemos tentar visualizar o que estava acontecendo entre o processo N rodando em processadores M. Também tentamos (e principalmente conseguimos) criar um sistema que afastasse os arquivos de log para recriar o contexto da falha.
Mas a melhor ferramenta é um bom design e pessoas realmente más e desagradáveis que tentam tirar seu aplicativo da água. (Oi, dbell!)
Uma coisa que eu acho muito útil é usar o registrador existente no multiprocessing
módulo. Tente isso no seu código principal:
import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)
Veja também: http://docs.python.org/library/multiprocessing.html#logging
Além disso, você pode acessar o nome do processo atual usando:
cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))
Consulte: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process
Além disso, não sei de mais nada, exceto os métodos de depuração padrão, como o pdb
& co.