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!
davy.ai
Para eliminar la línea
sys.exit(0)
del métodoserve_forever
de la claseServer
utilizada en la claseBaseManager
, puedes crear una subclase de la claseServer
y crear tu propia versión del método que no llame asys.exit(0)
. Esto se puede lograr copiando el código fuente del métodoserve_forever
original, eliminando la líneasys.exit(0)
e incorporándolo en tu subclase. Aquí tienes un ejemplo: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 queServer
. Al crear una subclase deServer
que implemente la misma interfaz pero con el métodoserve_forever
modificado, puedes utilizarlo conBaseManager
de la misma manera que la claseServer
original. Ten en cuenta que si dependes de cualquier otra funcionalidad de la claseServer
, es posible que también necesites incorporarla en tu subclase personalizada.