当模块 A 的函数应该是可导入的时,我如何从模块 B 修改模块 A,以便我可以使用 multiprocessing 标准库包运行模块 A 的函数?
客户请求的修补程序不适用于我们的任何其他客户,因此我创建了一个新分支并专门为他们编写了一个单独的模块,以便轻松合并主分支的更改。为了保持客户端与预修补程序行为的向后兼容性,我将修补程序实现为应用程序中的可配置设置。因此,我不想替换我的旧代码——只是在设置打开时修补它。我通过 monkey patching 做到了这一点.
__main__模块读取配置文件。如果配置打开了修补程序的开关,__main__ 通过用 hotfix 模块中定义的代码替换几个函数来修补我的 engine 模块——本质上,被替换的函数是 key function to a maximization function . engine 模块随后加载了一个 multiprocessing 的池。 worker 。
一旦multiprocessing worker 启动,第一件事就是multiprocessing 执行re-imports * engine 模块并寻找 __main__ 试图替换的关键函数(然后 multiprocessing 将控制权交给我的代码和最大化算法开始)。由于 engine 正在被一个全新的进程重新导入,并且新进程不会重新运行 __main__ (读取配置文件的地方),因为这会导致无限循环,它不知道重新修改 monkey-patch engine。
如何在我的代码中保持模块化(即,将修补程序代码保留在单独的模块中)并仍然利用 Python 的 multiprocessing 包?
* 请注意,我的代码必须在 Windows(对于我的客户端)和 Unix(为了我的理智...)上运行
最佳答案
这听起来像是猴子补丁不起作用的地方。将有问题的功能提取到单独的模块并让引擎从那里导入它们会更容易。也许您可以对从何处导入它们进行配置设置。
将其模块化的另一种方法是使用某种组件架构,例如 ZCA .我会选择最后一个选项,但那是因为我已经习惯了,所以我不需要额外学习。
关于 python 3 : Monkey-patched code not re-importable by multiprocessing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12427532/