一:通过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进程里是死循环,无法等待其结束,只能强行终
结果: