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!

 

-- 未完待续  --

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值