Pool进程池创建大量子进程,进程间通信
一:通过Pool创建大量子进程#!/usr/env/python#!-*- codoing:utf-8 -*-import osfrom multiprocessing import Poolimport time,randomdefchild_tasks(name):print 'this is %s child_task pid= %s' %(name,os.ge
·
一:通过Pool创建大量子进程
#!/usr/env/python
#!-*- codoing:utf-8 -*-
import os
from multiprocessing import Pool
import time,random
def child_tasks(name):
print 'this is %s child_task pid= %s' %(name,os.getpid())
start = time.time()
time.sleep(random.random()*3)
end = time.time()
print 'pid %s is run %0.2f second' % (os.getpid(),(end-start))
if __name__=='__main__':
print 'this is parent process %s' % os.getpid()
p=Pool(5)
for i in range(5):
p.apply_async(child_tasks,args=(i,))
p.close()
p.join()
print 'all process end'
结果:
代码解读:
对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
请注意输出的结果,task 0,1,2,3 4是立刻执行的,这是因为我对Pool有意设计的限制,P= Pool(5)可以同时执行5个task.
二进程间通信:
#!/usr/env/python
#!-*- codoing:utf-8 -*-
import os
from multiprocessing import Process,Queue
import time,random
def write(q):
list1 = ['A','B','C']
for value in list1:
print 'put %s to queue....' % value
q.put(value)
time.sleep(random.random()*3)
def read(q):
while True:
value = q.get()
print 'get value %s from queue' % value
if __name__=='__main__':
print 'i am parent prcess %s ' % os.getpid()
q=Queue()
pw = Process(target=write,args=(q,))
pr = Process(target=read,args=(q,))
pw.start()
pr.start()
pw.join()
pr.terminate()#pr进程里是死循环,无法等待其结束,只能强行终
结果:
更多推荐



所有评论(0)