首页 > 编程 > Python > 正文

python实现多进程代码示例

2020-02-15 23:29:11
字体:
来源:转载
供稿:网友

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

开辟子进程

multiprocessing中提供了Process类来生成进程实例

Process([group [, target [, name [, args [, kwargs]]]]])

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

先来个小例子:

# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime):  n = 0  while n < 3:    print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())  #获取当前进程号和正在运行是的时间    time.sleep(wTime)  #等待(休眠)    n += 1if __name__ == "__main__":  p = Process(target=run_proc, args=(2,)) #申请子进程  p.start()   #运行进程  print "Parent process run. subProcess is ", p.pid  print "Parent process end,{0}".format(time.ctime())

运行结果:

Parent process run. subProcess is 30196
Parent process end,Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:21 2017
subProcess 30196 run, Mon Mar 27 11:20:23 2017
subProcess 30196 run, Mon Mar 27 11:20:25 2017

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

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

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

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

# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime):  n = 0  while n < 3:    print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())    time.sleep(wTime)    n += 1if __name__ == "__main__":  p = Process(target=run_proc, args=(2,))  p.daemon = True  #加入daemon  p.start()  print "Parent process run. subProcess is ", p.pid  print "Parent process end,{0}".format(time.ctime())

执行结果:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表