python实现多进程代码示例

  

想要充分利用多核CPU资源,Python中大部分情况下都需要使用多进程,Python中提供了多处理这个包实现多进程.multiprocessing支持子进程,进程间的同步与通信,提供了过程,队列,管、锁等组件。

  

<强>开辟子进程
  

  

多处理中提供了过程类来生成进程实例

  

<代码>过程([集团[、目标[、名称(args [, kwargs]]]]])
  

  
      <李>集团分组,实际上不使用李   <李>目标表示调用对象,你可以传入方法的名字   <李>参数表示给调用对象以元组的形式提供参数,比如目标是函数,他有两个参数m, n,那么该参数为参数=(m, n)即可李   <李> kwargs表示调用对象的字典李   <李>名称是别名,相当于给这个进程取一个名字   
  

先来个小例子:

        # - * -编码:utf - 8 - *   从多处理导入过程,池   进口操作系统   导入的时间         def run_proc (wTime):   n=0   尽管n & lt;3:   打印”子流程% s,“% os.getpid (),“{0}”.format (time.ctime()) #获取当前进程号和正在运行是的时间   time . sleep (wTime) #等待(休眠)   n +=1      if __name__==癬_main__”:   p=过程(目标=run_proc args=(2) #申请子进程   p.start() #运行进程   打印“父进程运行。子流程”,p.pid   打印“父进程结束,{0}”.format (time.ctime ())      之前      

运行结果:

  
  

父进程运行。子过程是30196
  父进程结束,我的2017年3月27日11:20:21
  子流程30196运行,我的2017年3月27日11:20:21
  子流程30196运行,我的2017年3月27日11:20:23
  子流程30196运行,我的2017年3月27日11:20:25

     

根据运行结果可知,父进程运行结束后子进程仍然还在运行,这可能造成僵尸(僵尸)进程。

  

通常情况下,当子进程终结时,它会通知父进程,清空自己所占据的内存,并在内核里留下自己的退出信息。父进程在得知子进程终结时,会从内核中取出子进程的退出信息。但是,如果父进程早于子进程终结,这可能造成子进程的退出信息滞留在内核中,子进程成为僵尸(僵尸)进程。当大量僵尸进程积累时,内存空间会被挤占。

  

<强>有什么办法可以避免僵尸进程呢?
  

  

这里介绍进程的一个属性虚拟光驱,当其值为真时,其父进程结束,该进程也直接终止运行(即使还没运行完)。
  所以给上面的程序加上p.deamon=true,看看效果。

        # - * -编码:utf - 8 - *   从多处理导入过程,池   进口操作系统   导入的时间         def run_proc (wTime):   n=0   尽管n & lt;3:   打印”子流程% s,“% os.getpid (),“{0}”.format (time.ctime ())   time . sleep (wTime)   n +=1      if __name__==癬_main__”:   p=过程(目标=run_proc args=(2))   p。守护进程=True #加入守护进程   p.start ()   打印“父进程运行。子流程”,p.pid   打印“父进程结束,{0}”.format (time.ctime ())      

执行结果:

  
  

父进程运行。子过程是31856
  父进程结束,我的2017年3月27日11:40:10

     

这是问题又来了,子进程并没有执行完,这不是所期望的结果。有没办法将子进程执行完后才让父进程结束呢?
  

  

这里引入p.join()方法,它使子进程执行结束后,父进程才执行之后的代码

        # - * -编码:utf - 8 - *   从多处理导入过程,池   进口操作系统   导入的时间         def run_proc (wTime):   n=0   尽管n & lt;3:   打印”子流程% s,“% os.getpid (),“{0}”.format (time.ctime ())   time . sleep (wTime)   n +=1      if __name__==癬_main__”:   p=过程(目标=run_proc args=(2))   p。守护进程=True   p.start ()   p.join() #加入加入方法   打印“父进程运行。子流程”,p.pid   打印“父进程结束,{0}”.format (time.ctime ())      

执行结果:

  
  32076年

子流程运行,我的2017年3月27日11:46:07
  子流程32076运行,我的2017年3月27日11:46:09
  子流程32076运行,我的2017年3月27日11:46:11
  父进程运行。子过程是32076
  父进程结束,我的2017年3月27日11:46:13

  

python实现多进程代码示例