threading - ¿Cómo puedo perfilar un programa multiproceso en Python?
python synchronized variable (5)
Estoy desarrollando un módulo intrínsecamente multiproceso en Python, y me gustaría saber dónde está gastando su tiempo. cProfile solo parece perfilar el hilo principal. ¿Hay alguna forma de perfilar todos los hilos involucrados en el cálculo?
Dado que las funciones principales de los hilos diferentes son diferentes, puede usar el útil decorador profile_func()
desde aquí .
En lugar de ejecutar un cProfile
, podría ejecutar una instancia de cProfile
separada en cada hilo, luego combinar las estadísticas. Stats.add()
hace esto automáticamente.
No conozco ninguna aplicación de creación de perfiles que admita tal cosa para python, pero podría escribir una clase de rastreo que escriba archivos de registro donde se ingrese la información de cuándo se inicia una operación, cuándo finalizó y cuánto tiempo consumado.
Es una solución simple y rápida para su problema.
Si está de acuerdo con hacer un poco de trabajo extra, puede escribir su propia clase de creación de perfiles que implemente el profile(self, frame, event, arg)
. Se llama cuando se llama a una función, y puede configurar fácilmente una estructura para recopilar estadísticas a partir de eso.
Luego puede usar threading.setprofile
para registrar esa función en cada hilo. Cuando se llama a la función, puede usar threading.currentThread()
para ver en qué se está ejecutando. Más información (y receta lista para ejecutar) aquí:
http://code.activestate.com/recipes/465831/
http://docs.python.org/library/threading.html#threading.setprofile
Por favor, consulte yappi (Yet Another Python Profiler).