进程池可以减轻多进程对CPU的负担
把一个进程序列放入进程池,使用的时候,就会在进程池中取进程
如果进程池中没有进程了,脚本就会等待,直到进程池中有可用进程
进程池生成的子线程,不能直接运行,要放入进程池后才可以运行
串行
下面这个例子是一个串行的进程池,
通过for循环生成了14个子进程,但是进程池只允许5个进程
运行情况是这样的:
把生成的14个子进程的前5个进程放入进程池,进程池按照串行一个一个地执行这5个进程,每当这5个进程有一个执行完的时候,后面剩下的9个子进程就会放入一个进程到进程池里
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" from multiprocessing import Pool import time,os def Test(i): time.sleep(2) print ("In process",i,":",os.getpid()) if __name__ == '__main__': pool = Pool(processes=5) #允许进程池同时放入5个进程,并让cpu运行这5个进程 for i in range(14): pool.apply(func=Test,args=(i,)) #串行 print("Processes Run over") pool.close() pool.join() #进程池中要先close再join
运行结果
并行
运行情况:
把生成的14个子进程的前5个进程放入进程池,进程池按照并行同时执行5个进程,每当这5个进程有一个执行完的时候,后面剩下的9个子进程就会放入一个进程到进程池里,再同时执行5个进程
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" from multiprocessing import Pool import time,os def Test(i): time.sleep(2) print ("In process",i,":",os.getpid()) if __name__ == '__main__': pool = Pool(processes=5) #允许进程池同时放入5个进程,并让cpu运行这5个进程 for i in range(14): pool.apply_async(func=Test,args=(i,)) #并行 print("Processes Running") pool.close() pool.join() #进程池中要先close再join,如果没有join的话脚本就会停止运行
运行
因为前5个进程是同时开始执行也是同时执行完的,所以后面来的进程也是同时5个传入,同时执行
并行进程池中的回调
# -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" from multiprocessing import Pool import time,os def Test(i): time.sleep(2) print ("In process",i,":",os.getpid()) return i def Back(n): print("Process",n,":-------<",os.getpid(),">--------") if __name__ == '__main__': pool = Pool(processes=5) #允许进程池同时放入5个进程,并让cpu运行这5个进程 for i in range(14): pool.apply_async(func=Test,args=(i,),callback=Back) #callback为回调函数,每个进程执行完,执行callback的回调函数 print("主进程的进程号:",os.getpid()) pool.close() pool.join() #进程池中要先close再join,如果没有join的话脚本就会停止运行
运行
进程池中的回调函数是主进程启动执行的,所以进程号是一样的