Quelles sont les bonnes pratiques de débogage des programmes de multiprocesseurs en Python?
la source
Quelles sont les bonnes pratiques de débogage des programmes de multiprocesseurs en Python?
Les vrais programmes Python multiprocesseurs (par opposition aux programmes Python multithread qui doivent gérer le redoutable GIL ) ne sont pas différents de ceux de n'importe quel autre langage. Ils ont tous les mêmes défis de base:
Bien qu'il existe des méthodes de développement qui essaient d'éviter chacun de ces problèmes, à la fin de la journée, vous devez vraiment réfléchir à ce que vous faites. Je recommande des tests de résistance lourds - bien au-delà de tout ce qui pourrait se produire dans la vie réelle - afin que vous ayez de bonnes chances de frapper ces fenêtres d'opportunité et de exploser en cours de développement, par opposition à une démo majeure ou pendant la production.
Nous avions l'habitude d'utiliser des fichiers journaux horodatés en microsecondes, puis nous avons créé une application d'affichage des journaux à code couleur afin que nous puissions essayer de visualiser ce qui se passait entre les processus N exécutés sur M processeurs. Nous avons également essayé (et surtout réussi) à créer un système qui chasserait les fichiers journaux pour recréer le contexte de l'accident.
Mais le meilleur outil est un bon design et des gens vraiment méchants et méchants qui essaient de faire sauter votre application hors de l'eau. (Salut, dbell!)
Une chose que je trouve très utile, c'est d'utiliser l'enregistreur existant dans le multiprocessing
module. Essayez ceci dans votre code principal:
import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)
Voir également: http://docs.python.org/library/multiprocessing.html#logging
De plus, vous pouvez accéder au nom du processus actuel en utilisant:
cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))
Voir: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process
En dehors de cela, je ne connais rien d'autre que les méthodes de débogage standard comme pdb
& co.