想要充分利用多核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:13python实现多进程代码示例