python启动进程函数 python启动进程并获取pid( 四 )


开辟子进程
multiprocessing中提供了Process类来生成进程实例
Process([group [, target [, name [, args [, kwargs]]]]])1
group分组,实际上不使用
target表示调用对象,你可以传入方法的名字
args表示给调用对象以元组的形式提供参数,比如target是函数a,python启动进程函数他有两个参数m,n,那么该参数为args=(m, n)即可
kwargs表示调用对象的字典
name是别名 , 相当于给这个进程取一个名字
先来个小例子:
# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime):
n = 0
while n3: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.pidprint "Parent process end,{0}".format(time.ctime())12345678910111213141516171819
运行结果:
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 n3: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.pidprint "Parent process end,{0}".format(time.ctime())1234567891011121314151617181920
执行结果:
Parent process run. subProcess is 31856
Parent process end,Mon Mar 27 11:40:10 2017
这是问题又来了,子进程并没有执行完,这不是所期望的结果 。有没办法将子进程执行完后才让父进程结束呢?
这里引入p.join()方法,它使子进程执行结束后,父进程才执行之后的代码
# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timedef run_proc(wTime):
n = 0
while n3: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
p.start()
p.join()#加入join方法
print "Parent process run. subProcess is ", p.pidprint "Parent process end,{0}".format(time.ctime())123456789101112131415161718192021
执行结果:
subProcess 32076 run, Mon Mar 27 11:46:07 2017
subProcess 32076 run, Mon Mar 27 11:46:09 2017
subProcess 32076 run, Mon Mar 27 11:46:11 2017
Parent process run. subProcess is 32076
Parent process end,Mon Mar 27 11:46:13 2017
这样所有的进程就能顺利的执行了 。

推荐阅读