简单来说
当模块 A 的功能应该是可导入的时,我如何从模块 B 修补模块 A,以便我可以使用multiprocessing
标准库包运行模块 A 的功能?
背景
一个客户请求了一个不适用于我们任何其他客户的修补程序,因此我创建了一个新分支并为他们编写了一个单独的模块,以便轻松合并来自主分支的更改。为了保持客户端与预修补程序行为的向后兼容性,我将修补程序实现为应用程序中的可配置设置。因此我不想替换我的旧代码——只需在打开设置时对其进行修补。我通过猴子修补来做到这一点。
代码结构
__main__
模块读入配置文件。如果配置打开了修补程序的开关,则通过用模块中定义的代码替换几个函数来__main__
修补我的模块——本质上,被替换的函数是最大化函数的关键函数。该模块稍后会加载一个工人池。engine
hotfix
engine
multiprocessing
问题
一旦multiprocessing
工作人员开始工作,它首先multiprocessing
会重新导入*engine
模块并查找__main__
试图替换的关键函数(然后multiprocessing
将控制权交给我的代码并开始最大化算法)。由于engine
正在由一个全新的进程重新导入并且新进程不会重新运行__main__
(读取配置文件的位置),因为这会导致无限循环,因此它不知道 re-monkey-patch engine
。
问题
如何在我的代码中保持模块化(即,将修补程序代码保存在单独的模块中)并仍然利用 Python 的multiprocessing
包?
* 请注意,我的代码必须在 Windows(对于我的客户端)和 Unix(对于我的理智......)