覆盖我想继承的另一个 class 依赖的内置 class 方法

Overriding a built-in class method that another class I want to inherit from relies on

所以我正在编写一个 script/application,它使用 python 多处理 BaseManager class。现在大部分情况下它工作得很好,我唯一的问题是我使用 serve_forever 作为阻塞语句然后继续向前但是当我想终止或退出 serve_forever() 函数时(ality) 它会自动退出并终止应用程序,但正如我提到的,在完全退出之前我还有一些事情需要处理。

我可以通过 stop_event.set() 设置停止事件退出 serve_forever()。现在这一切都很好,但根据来源 (https://github.com/python/cpython/blob/3.6/Lib/multiprocessing/managers.py#L147) serve_forever 明确指出 sys.exit(0) 并且是 Server class 的一部分 BaseManager 在它的定义中使用。本质上,我想删除该行 (sys.exit(0))。我将如何完成这个?

当我搜索时,我会得到诸如猴子补丁之类的结果?我可以只 Subclass 服务器 class,明确定义 serve_forever 为完全相同的代码,但没有 sys.exit(0) 行并结束它吗?有些事情告诉我那是行不通的。我是 subclass Server 和 BaseManager 吗?

谢谢!

尝试猴子补丁或继承内部 类 将导致代码在 Python 版本之间不兼容,甚至补丁也不兼容。

最重要的是,这些解决方案将不必要地复杂和复杂,并且总体上不受欢迎。

我强烈建议使用 start() 方法和一个事件来重新实现 serve_forever()。等待事件被调用,或者,如果不可能,循环检查管理器是否还活着,在我能想到的几乎所有方面都会更容易和更好的解决方案。


在聊天中讨论后,我们意识到最简单的方法是只抑制从 sys.exit() 抛出的 SystemExit。我相应地在 CPython 错误跟踪器上打开了一个 bug report 以防止 sys.exit()。请记住,服务器实际上不会关闭,因为它在另一个线程上 运行。在 stdlib 中使用 .server().serve_forever() 的整个建议充其量看起来是可疑的。

如果您希望立即关闭服务器,捕获异常后调用Server.listener.close()