Python 多处理 CPU 绑定并发,无需克隆 main



我目前正在使用 python 多处理编写 CPU 绑定脚本。主模块有很多导入语句,这些语句会在新进程的启动时产生开销。这些导入对于运行程序的并行部分不是必需的,因此我不想导入它们。这可以通过将我所有的导入语句放在if __name__ == "__main__":来解决,但这是一个大型代码库,并行处理模块可能被许多不同经验水平的开发人员使用。(我不想修复所有问题,也不想让其他人破坏它(。

我只想导入必要的模块来运行代码的并行处理部分。我找到了解决方法,但它让我感到震惊...哈克。我更新了sys.modules,并说__main__是具有并行处理的模块,然后在完成后将main放回原处。例如:

try:
main = sys.modules["__main__"]
sys.modules.update({"__main__": sys.modules[__name__]})
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
finally:
sys.modules.update({"__main__": main})

此代码运行,仅导入所需的模块。但我担心的是,在表面之下隐藏着一些可怕的后果。

理想情况下,我想要一种多处理的替代方案,让我可以更好地控制在进程生成时克隆的内容。有没有人有一个建议,一个不那么可怕的解决方法或保证我的工作并不像我担心的那么可怕?

我正在使用Windows和python 3.5。

谢谢!

我的猜测是joblib会做得更好,请参阅这个非常完整的讨论以获取更多信息。

相关内容

  • 没有找到相关文章