Cómo implementar el registro compatible con multiprocesamiento en Python
El multiprocesamiento en Python permite la creación de múltiples procesos que se ejecutan de forma independiente. Sin embargo, acceder a recursos compartidos, como archivos de registro, puede volverse complejo ya que varios procesos pueden intentar escribir en ellos simultáneamente.
Para evitar este problema, el módulo de multiprocesamiento de Python proporciona capacidades de registro con reconocimiento de multiprocesamiento a nivel de módulo. Esto permite que el registrador evite la confusión de los mensajes de registro al garantizar que solo un proceso escriba en un descriptor de archivo específico a la vez.
Sin embargo, es posible que los módulos existentes dentro del marco no sean compatibles con el multiprocesamiento, lo que genera la necesidad para soluciones alternativas. Un enfoque implica la creación de un controlador de registro personalizado que envía mensajes de registro al proceso principal a través de una tubería. importar multiprocesamiento, subprocesamiento, registro, sistema, rastreo clase MultiProcessingLog(logging.Handler): def __init__(self, nombre, modo, tamaño máximo, rotar): registro.Handler.__init__(self) # Configurar el controlador de archivos para el proceso padre self._handler = RotaryFileHandler (nombre, modo, tamaño máximo, rotar) # Crear una cola para recibir mensajes de registro de procesos secundarios self.cola = multiprocesamiento.Cola(-1) # Iniciar un hilo en el proceso principal para recibir y registrar mensajes t = threading.Thread(destino=self.receive) t.daemon = Verdadero t.inicio() def recibir (yo): mientras que Verdadero: intentar: # Obtener un registro de la cola registro = self.cola.get() # Registre el registro utilizando el controlador de archivos del proceso principal self._handler.emit(registro) # Salir del hilo si se genera una excepción excepto (Interrupción del teclado, Salida del sistema): aumentar excepto EOFError: romper excepto: traceback.print_exc(archivo=sys.stderr) def enviar(yo, s): # Poner el registro en la cola para el hilo receptor self.queue.put_nowait(s) def _format_record(self, grabar): # Stringifique cualquier objeto en el registro para garantizar que se pueda enviar a través de la tubería. si registro.args: registro.msg = registro.msg % registro.args record.args = Ninguno si registro.exc_info: ficticio = self.format(registro) record.exc_info = Ninguno registro de devolución def emitir(auto, grabar): intentar: # Formatear y enviar el registro a través de la tubería s = self._format_record(registro) autoenvío(s) excepto (Interrupción del teclado, Salida del sistema): aumentar excepto: self.handleError (registro) def cerrar(yo): # Cerrar el controlador de archivos y el controlador mismo self._handler.close() logging.Handler.close(self)
Este controlador de registro personalizado permite que los módulos dentro del marco utilicen prácticas de registro estándar sin tener que ser conscientes del multiprocesamiento. Los mensajes de registro se envían desde los procesos secundarios al proceso principal a través de una tubería, lo que garantiza que no sean confusos y se escriban correctamente en el archivo de registro.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3