Procesos de trabajadores de registro con pitón paralelo
-
25-09-2019 - |
Pregunta
He heredado el mantenimiento de una computación científica utilizando pitón paralelo en un clúster. Con Python paralelo, los trabajos se envían a un PPServer, que (en este caso) habla con procesos PPServer que ya están en otras computadoras, distribuyendo tareas a los procesos de PPWorkers.
Me gustaría utilizar el módulo de registro de la biblioteca estándar para registrar errores y depurar información de las funciones que se envían a un PPServer. Dado que estos trabajadores PP se ejecutan como procesos separados (en computadoras separadas) no estoy seguro de cómo estructurar correctamente el registro. ¿Debo iniciar sesión en un archivo separado para cada proceso? ¿Quizás hay un controlador de registro que lo mejoraría todo?
Además, quiero informes sobre qué proceso sobre qué computadora ha presentado un error, pero el código en el que estoy escribiendo el registro probablemente no sea consciente de estas cosas; ¿Quizás eso debería estar sucediendo a nivel de PPServer?
(Versión de la pregunta Postada cruzada en foros paralelos de Python, publicaré una respuesta aquí si obtengo algo allí sobre esto de un usuario no así)
Solución
Una forma de resolver su problema es hacer lo siguiente:
- En cada proceso de trabajador, use un
logging.handlers.SocketHandler
Para enviar eventos del trabajador a un proceso de registrador dedicado. - Cree un proceso de registrador dedicado que escuche los eventos de registro en un socket, basado en el ejemplo de trabajo dado en los documentos en https://docs.python.org/3/howto/logging-cookbook.html#sending-and-------reciving-logging-events-across-a-network
- Lucro ;-)
Si atrapa excepciones en las funciones de su trabajador y las registra, entonces debería poder obtener visibilidad de los errores en todos los trabajadores en un solo lugar.
Otros consejos
Usaría Python's logging
y socket
Apis. Solo sigue el ejemplo aquí.
Simplemente comience un ppworker
dedicado a registrar en algún lugar y crear un nuevo logging.Logger
en cada uno de los otros trabajadores con un logging.SocketHandler
especificando el nombre de host y el puerto de la máquina que ejecuta el registro ppworker
.
Si tiene un servidor syslog en ejecución, también puede usar Python's syslog
módulo, que está documentado aquí.