es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sobrescribir un método de clase incorporado en el que otra clase de la que quiero heredar depende.

Entonces, estoy escribiendo un script/aplicación que utiliza la clase BaseManager de la multiprocesamiento de Python. En su mayor parte, funciona muy bien, el único problema que tengo es que estoy utilizando serve_forever como una declaración de bloqueo y luego continúo, sin embargo, cuando quiero terminar o salir de la función serve_forever(), automáticamente sale y termina la aplicación, pero como mencioné, tengo algunas cosas más de las que quiero encargarme antes de salir por completo.

Puedo salir de serve_forever() configurando un evento de parada con stop_event.set(). Ahora bien, esto está muy bien, sin embargo, según la fuente (https://github.com/python/cpython/blob/3.6/Lib/multiprocessing/managers.py#L147), serve_forever explícitamente indica sys.exit(0) y forma parte de la clase Server que utiliza BaseManager en su definición. Básicamente, me gustaría eliminar esa línea (sys.exit(0)). ¿Cómo puedo lograr esto?

Cuando busco, obtengo resultados como ¿parchear el código? ¿Puedo simplemente crear una subclase de la clase Server, definir explícitamente serve_forever como el mismo código pero sin la línea sys.exit(0) y ya está? Algo me dice que eso no va a funcionar. ¿Debo hacer una subclase de Server Y BaseManager?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar la línea sys.exit(0) del método serve_forever de la clase Server utilizada en la clase BaseManager, puedes crear una subclase de la clase Server y crear tu propia versión del método que no llame a sys.exit(0). Esto se puede lograr copiando el código fuente del método serve_forever original, eliminando la línea sys.exit(0) e incorporándolo en tu subclase. Aquí tienes un ejemplo:

    from multiprocessing.managers import Server
    
    class CustomServer(Server):
        def serve_forever(self):
            # Copia todo el contenido del método serve_forever original, pero elimina la línea sys.exit(0)
            ...
    
    # Utiliza CustomServer en lugar de Server en tu clase BaseManager
    

    No es necesario crear una subclase de BaseManager, ya que está diseñada para ser genérica y debería funcionar con cualquier clase de servidor que siga la misma interfaz que Server. Al crear una subclase de Server que implemente la misma interfaz pero con el método serve_forever modificado, puedes utilizarlo con BaseManager de la misma manera que la clase Server original. Ten en cuenta que si dependes de cualquier otra funcionalidad de la clase Server, es posible que también necesites incorporarla en tu subclase personalizada.

Comments are closed.