Python 3:猴子修补的代码不能通过多处理重新导入

wks*_*rtz 8 python import monkeypatching multiprocessing python-3.x

简单来说

当模块A的函数应该是可导入的时候,如何从模块B中获取补丁模块A,以便我可以使用multiprocessing标准库包运行模块A的函数?

背景

客户端请求了一个不适用于我们任何其他客户端的修补程序,因此我创建了一个新分支,并为它们编写了一个单独的模块,以便从主分支中轻松合并更改.为了保持客户端与预修复程序行为的向后兼容性,我在应用程序中将此修补程序实现为可配置设置.因此,我不想替换旧代码 - 只需在打开设置时对其进行修补即可.我通过猴子修补做到了这一点.

代码结构

__main__模块读入配置文件.如果配置打开了修补程序的开关,则通过用模块中定义的代码替换几个函数来__main__修补我enginehotfix模块 - 实质上,被替换的函数是最大化函数关键函数.该engine模块稍后会加载一个工作池multiprocessing.

问题

一旦multiprocessing工作人员开始工作,第一件事multiprocessing就是重新导入*engine模块并查找__main__试图替换的关键功能(然后multiprocessing将控制交给我的代码并开始最大化算法).由于engine正在通过一个全新的流程重新导入,并且新流程不会重新运行__main__(配置文件被读取的地方)因为这会导致无限循环,所以它不知道重新进行猴子补丁engine.

问题

如何在代码中保持模块化(即,将修补程序代码保存在单独的模块中)并仍然利用Python的multiprocessing包?

*注意我的代码必须在Windows(对我的客户端)和Unix(为了我的理智......)上工作

Eth*_*man 0

听起来您将不得不修改engine.py以检查配置文件,并在需要时对其进行修补。

要在unix和Windows上工作,engine可以保留一个全局CONFIG_DONE变量来决定是否需要再次检查配置文件。