python多进程的一些心得体会

python的multiprocessing库博大精深,有很多细节记录下:

1、使用定义Process子类的方法,无法使用pool列表将其包含进来二次引用进行全局控制。

2、使用Process指定target的方法可以使用pool列表将多个进程包含进来,进而进行统一控制,比如join操作。

3、可以使用multiprocessing的Manager定义进程间共享对象,但如果共享object的包含子项太多,且需要在各个子进程中逐一遍历,那么会有非常非常非常严重的通讯开销,导致多进程奇慢无比。

4、继承BaseManager定义子manager,只能实现共享class的方法,无法共享class的属性,需要定义一个Namespace。

5、使用multiprocessing的时候,将访问入口定义在__main__中,可以尽可能降低错误情况,尤其是在windows系统下。

6、使用multiprocessing的Pool库的apply_async或者map_async时,在windows有时会有奇怪现象:查看资源管理器,的确有指定个数的进程在运行,在大部分进程都是僵死进程,即没有真正的在运行跑数,其原因是Pool只负责启动N个子进程,不负责实际的资源调度和运行(实际有os负责),建议在windows下通过Process指定target的方式启动多进程。

7、在子进程中定义class,该class实例化的时,输入的参数对象是deepcopy,即输入前后的对象不再是同个对象,而通过Manager共享变量的方式传递,则传入前后是同个对象(使用id()函数查看!)。

8、对比numpy创建的array和嵌套的list的list,numpy的array占用内存空间远远大于嵌套list!

-- 未完待续  --

发布了64 篇原创文章 · 获赞 24 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qm5132/article/details/104738235
今日推荐