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的主要内容,如果未能解决你的问题,请参考以下文章

python基础-并发编程part01

Python GIL(全局解释器锁)

python的多线程为什么不能利用多核CPU?

Python:多任务,并发,并行的理解及线程进程的对比

python 并发编程

进程,操作系统,Python并发编程之多进程