进程池
进程池就是一个特殊的容器可以容纳很多的进程
池的作用,缓冲,特点:能够重复使用进程池里的进程
为什么会有进程池。
原因:程序的创建和销毁需要花大量的资源,所以有了进程池,能够重复使用进程池里的进程。
进程池里面可以有很多进程,但是可能会有更多的任务要去做。
那么调用进程执行任务时,一个进程执行完任务,进程池会自己管理,来再次调用,又去执行另外的任务。
for example:
sequenceDiagram
100个任务
2种方案:
1.创建100个进程
2.创建10个进程的进程池
选2
2个任务
2种方案:
1.创建2个进程
2.创建2个进程的进程池
选1
根据实际应用场景来选择是否用进程池
进程池创建
1.创建进程池
2.进程池使用
导入进程池模块
from multiprocessing import Pool
创建进程池
po = Pool(3)
进程池的apply_async方法向其中加任务
po = Pool(3)
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
关闭进程池close(),让主进程阻塞等待join()
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句后
总代码:(进程池中任务worker的完成及时间统计)
from multiprocessing import Pool
import os,time,random
def worker(msg):
t_start =time.time()
print ("%s开始执行,进程号为%d" % (msg,os.getpid()))
# random.random()随机生成0-1之间的浮点数
time.sleep(random.random()*2)
t_stop =time.time()
print (msg,"执行完毕,耗时%0.2f" % (t_stop-t_start ))
def main():
po = Pool(3)
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
print ("-----start-----")
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句后
print ("----end-----")
# 定义一个进程池,最大进程数
if __name__ == '__main__':
main()
效果: