2009-04-27 11 views
5

Tengo un servicio Python de larga duración y me gustaría saber cuánto tiempo acumulado de reloj de pared ha pasado cualquier hilo ejecutable (es decir, hilos que no fueron bloqueados por algún otro motivo) esperando el GIL. ¿Hay una forma fácil de hacer esto? Por ejemplo, quizás podría periódicamente arrojar algún contador a su archivo de registro.¿Hay alguna manera fácil de saber cuánto tiempo se pasa esperando el Python GIL?

Mi motivación subyacente es descartar el GIL como una fuente de latencia de respuesta misteriosa de estos procesos de larga ejecución. No hay ninguna razón en particular para sospechar de GIL (aparte de que cabría los síntomas), pero otras formas de registro no han encontrado nada todavía, así que si es fácil, sería bueno tener esta información .

Respuesta

3

No creo que haya una manera fácil. Probablemente exista una forma incómoda, que implique reconstruir Python para atravesar la lista PyThreadState y contar los hilos cada vez que se adquiere el bloqueo, ¡pero dudo que valga la pena el esfuerzo!

Sé que esta es una pregunta especulativa, pero si usted está incluso moderadamente preocupado por las demoras causadas por el enhebrado, puede ser prudente pasar a un modelo de multiprocesamiento en lugar de un modelo de subprocesamiento múltiple. Dado que los procesos son más seguros y más escalables en Python, casi siempre son la mejor opción si es práctico.

0

Ahora puede perfilar el uso de GIL usando gil_load.

Ver my answer a la otra pregunta.

+0

El proyecto gil_load le indica la frecuencia con la que se retiene el GIL (es decir, * al menos un * hilo es ejecutable). La pregunta pregunta con qué frecuencia se está esperando el GIL (es decir, * al menos dos * hilos son ejecutables). ¿Cómo lo logras con gil_load? –

Cuestiones relacionadas