python起进程的函数 python启动进程并获取pid( 三 )


有什么办法可以避免僵尸进程呢?
这里介绍进程的一个属性 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
这样所有的进程就能顺利的执行了 。
将进程定义成类
通过继承Process类,来自定义进程类,实现run方法 。实例p通过调用p.start()时自动调用run方法 。
如下:
# -*- coding:utf-8 -*-from multiprocessing import Process, Poolimport osimport timeclass Myprocess(Process):
def __init__(self, wTime):
Process.__init__(self)
self.wTime = wTimedef run(self):
n = 0
while n3:print "subProcess %s run," % os.getpid(), "{0}".format(time.ctime())
time.sleep(self.wTime)
n += 1if __name__ == "__main__":
p = Myprocess(2)
p.daemon = True
p.start()#自动调用run方法
p.join()print "Parent process run. subProcess is ", p.pidprint "Parent process end,{0}".format(time.ctime())12345678910111213141516171819202122232425262728
执行结果和上一个例子相同 。
创建多个进程
很多时候系统都需要创建多个进程以提高CPU的利用率,当数量较少时,可以手动生成一个个Process实例 。当进程数量很多时,或许可以利用循环,但是这需要程序员手动管理系统中并发进程的数量 , 有时会很麻烦 。这时进程池Pool就可以发挥其功效了 。可以通过传递参数限制并发进程的数量,默认值为CPU的核数 。
直接上例子:
# -*- coding:utf-8 -*-from multiprocessing import Process,Poolimport os,timedef run_proc(name):##定义一个函数用于进程调用
for i in range(5):
time.sleep(0.2)#休眠0.2秒
print 'Run child process %s (%s)' % (name, os.getpid())#执行一次该函数共需1秒的时间if __name__ =='__main__': #执行主进程
print 'Run the main process (%s).' % (os.getpid())
mainStart = time.time() #记录主进程开始的时间
p = Pool(8)#开辟进程池
for i in range(16):#开辟14个进程
p.apply_async(run_proc,args=('Process'+str(i),))#每个进程都调用run_proc函数,
#args表示给该函数传递的参数 。

推荐阅读