Python 多处理 CPU 没有克隆 main 的绑定并发
Python multiprocessing CPU bound concurrency without cloning main
我目前正在使用 python 多处理编写 CPU 绑定脚本。主模块有很多 import 语句,这些语句在新进程启动时会产生开销。这些导入对于 运行 程序的并行部分不是必需的,因此我不想导入它们。这可以通过将我所有的导入语句放在 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})
此代码 运行s 并且仅导入所需的模块。但我担心表面之下隐藏着一些可怕的后果。
理想情况下,我想要一种多处理的替代方法,它可以让我更好地控制在进程生成时克隆的内容。有没有人有建议、不那么可怕的解决方法或保证我的解决方法没有我担心的那么可怕?
我正在使用 Windows 和 python 3.5.
谢谢!
我猜 joblib
会做得更好,有关更多信息,请参阅 this very complete discussion。
我目前正在使用 python 多处理编写 CPU 绑定脚本。主模块有很多 import 语句,这些语句在新进程启动时会产生开销。这些导入对于 运行 程序的并行部分不是必需的,因此我不想导入它们。这可以通过将我所有的导入语句放在 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})
此代码 运行s 并且仅导入所需的模块。但我担心表面之下隐藏着一些可怕的后果。
理想情况下,我想要一种多处理的替代方法,它可以让我更好地控制在进程生成时克隆的内容。有没有人有建议、不那么可怕的解决方法或保证我的解决方法没有我担心的那么可怕?
我正在使用 Windows 和 python 3.5.
谢谢!
我猜 joblib
会做得更好,有关更多信息,请参阅 this very complete discussion。