进程池
为什么使用进程池:
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大
而且极其的浪费资源!
此时就可以用到multiprocessing模块提供的Pool方法。
进程池的创建:
1 # -*- coding:utf8 -*- 2 #Author: ZCB 3 4 from multiprocessing import Pool 5 import os,time,random 6 7 def func(msg): 8 t_start = time.time() 9 print("%s 开始执行,进程号为%d "%(msg,os.getpid())) 10 time.sleep(random.random()*2) #0-1 11 t_stop = time.time() 12 print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start)) 13 14 if __name__ == '__main__': 15 pool = Pool(3) #池里最多开三个进程 16 for i in range(10): 17 pool.apply_async(func,(i,)) 18 19 print("{:=^20}".format("start")) 20 pool.close() #关闭进程池后,poll 不再接受新的请求 21 pool.join() # 主进程要 等待 子进程执行完毕 它必须放在 close() 后 22 print("{:=^20}".format("end")) 23 ''' 24 输出: 25 =======start======== 26 0 开始执行,进程号为13148 27 1 开始执行,进程号为7988 28 2 开始执行,进程号为1916 29 0 执行完毕,耗时0.34 30 3 开始执行,进程号为13148 31 1 执行完毕,耗时0.44 32 4 开始执行,进程号为7988 33 2 执行完毕,耗时1.09 34 5 开始执行,进程号为1916 35 4 执行完毕,耗时0.83 36 6 开始执行,进程号为7988 37 6 执行完毕,耗时0.58 38 7 开始执行,进程号为7988 39 5 执行完毕,耗时0.85 40 8 开始执行,进程号为1916 41 8 执行完毕,耗时0.30 42 9 开始执行,进程号为1916 43 3 执行完毕,耗时1.99 44 7 执行完毕,耗时1.08 45 9 执行完毕,耗时1.71 46 ========end========= 47 '''
注意:pool.join()一定要放在 pool.close() 后,join()的目的是让主进程等待子进程执行完毕!