Python 多进程加速:使用 Pool 实现并行计算

哎,刚开始做这个东西的时候我头疼了好久。
记得有一个冬天,我在北京,写一个小型的图像处理工具,CPU 不太好用。
后来我想尝试一下这个多进程。

先说最关键的坑,就是if __name__ == "__main__":我一开始忘了写这句话。
结果在Linux服务器上运行时,进程疯狂创建,最后系统直接崩溃。
我当时很着急,花了很长时间才弄清楚问题出在哪里。

还有就是进程数,不要随意设置。
我尝试过一次,放了3 2 个进程,但是系统被阻塞了。
经过询问才知道我的CPU只有4 核。
后来改成8 就好了。
我记得有一个公式,就是设置为CPU核心数的1 .5 倍左右,不过最好的办法还是自己去尝试一下。

数据共享也是一个值得关注的问题。
之前想通过字典来更新值,但是崩溃了。
后来我用Manager创建了一个字典并传递过来,果然成功了。
这样虽然效率低下,但比直接通过要好。

我在使用 imap_unordered 时也遇到了问题。
有一个任务特别简单,结果却发现顺序完全乱了,最终的结果也不正确。
后来我改用 imap。
但是,图像被遮挡。
如果任务较多,注意不要阻塞整个程序。

异步提交apply_async 我没怎么用过它,但我记得有一个场景它特别有用。
当任务花费的时间非常不均匀时,您可以使用它及时返回结果,而不必等待所有任务完成。
例如,当我处理视频帧时,有些很复杂,有些很简单,所以我可以在处理过程中使用结果。

总的来说,这个东西用起来很快。
切换到批处理后,我的图像处理工具速度提高了一倍。
然而,由于进程间通信和死锁,调试需要很长时间。
与多线程不同,多线程中的问题通常出在 GIL 上,而这一问题更为复杂。

您对此有什么具体问题吗?例如数据传输或进程号设置?我当时遇到的陷阱也许可以帮助你。

算法工程师的血泪:Python多进程为何越跑越慢?