Python 多处理 CPU 绑定并发,无需克隆 main
Posted
技术标签:
【中文标题】Python 多处理 CPU 绑定并发,无需克隆 main【英文标题】:Python multiprocessing CPU bound concurrency without cloning main 【发布时间】:2020-09-06 00:03:08 【问题描述】:我目前正在使用 python 多处理编写一个 CPU Bound 脚本。主模块有很多导入语句,这会在新进程的启动时产生开销。这些导入不是运行程序的并行部分所必需的,所以我不想导入它们。这可以通过将我所有的导入语句放在if __name__ == "__main__":
中来解决,但这是一个大型代码库,许多不同经验水平的开发人员可能会使用并行处理模块。 (我不想修复所有东西,也不想让其他人破坏它)。
我只想导入必要的模块来运行代码的并行处理部分。我找到了一种解决方法,但它让我觉得...... hacky。我更新 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。
谢谢!
【问题讨论】:
【参考方案1】:我的猜测是joblib
会做得更好,请参阅this very complete discussion 了解更多信息。
【讨论】:
以上是关于Python 多处理 CPU 绑定并发,无需克隆 main的主要内容,如果未能解决你的问题,请参考以下文章