进程间的通信---进程池Pool
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue()
1 from multiprocessing import Pool,Manager 2 import os,time 3 4 def write(q): 5 print("%s is start(write)---父进程为----%s"%(os.getpid(),os.getppid())) 6 for i in range(5): 7 print("put------- %d"%i) 8 q.put(i) 9 time.sleep(0.5) 10 11 def read(q): 12 print("%s is start(write)---父进程为----%s"%(os.getpid(),os.getppid())) 13 for i in range(q.qsize()): 14 print("---get %d----"%q.get(i)) 15 time.sleep(0.5) 16 17 print("%s start-----"%os.getpid()) 18 pl = Pool(5) 19 20 # 修改import中的Queue为Manager 21 q = Manager().Queue() 22 23 # 阻塞的方式创建进程, 24 pl.apply(write,(q,)) 25 pl.apply(read,(q,)) 26 27 # 关闭进程池 28 pl.close() 29 # 等待结束 30 pl.join()
运行结果:
35077 start----- 35078 is start(write)---父进程为----35077 put------- 0 put------- 1 put------- 2 put------- 3 put------- 4 35079 is start(write)---父进程为----35077 ---get 0---- ---get 1---- ---get 2---- ---get 3---- ---get 4----