Python 多进程编程之multiprocessing--Pool
----当需要创建的子进程数量不多的时候,可以直接利用multiprocessing 中的Process 动态生成多个进程,
----但是,如果是成百上千个任务,手动创建的话,工作量会很大,此时就会用到multiprocessing 下的Pool
----初始化Pool 时,可以指定一个最大的进程数,当背后的请求提交到Pool 中时,如果池子没有满,那么就会创建一个新的进程来执行该请求. 如果满了(池子中的进程以及达到最大进程数)那么该请求就会等待,直到池子中有进程结束,才会创建新的进程来执行.
from multiprocessing import Pool import os,time,random #定义一个函数 def download(i): print("(%d)--ID号为:%d的进程开始执行"%(i,os.getpid())) t_start = time.time() time.sleep(random.random()*10) t_stop = time.time() print("(%d)---ID:%d执行完毕,耗时%f秒!"%(i,os.getpid(),t_stop-t_start)) if __name__ == "__main__": po = Pool(3)#定义一个进程池,最大进程的数量 for i in range(10): #每次循环将会用空闲出来的子进程去调用目录--同步(自加阻塞) #po.apply(func=download,args=(i,)) #每次循环将会用空闲出来的子进程去调用目录--异步 po.apply_async(func=download,args=(i,)) print("----start----") po.close()#关闭进程池,关闭后po就不再接收您的请求。 po.join() #等待po中所有的子进程执行完成,必需放在close之后。 print("----end------")
- 添加join()的原因是,
----此方法可能不会在页面打印除任何内容,因为一次执行3个进程
----3个进程执行的时间相差极为短暂,会在打印页面引起冲突,所以不会有任何内容输出 -
po.apply(func=download,args=(i,)) 执行的结果如下:你会发现是每次执行一个进程.
-
(0)id号为:25334的进程开始执行 (0)id号25334执行完毕,耗时3.866196秒 (1)id号为:25335的进程开始执行 (1)id号25335执行完毕,耗时3.393492秒 (2)id号为:25333的进程开始执行 (2)id号25333执行完毕,耗时9.758717秒 (3)id号为:25334的进程开始执行 (3)id号25334执行完毕,耗时0.150672秒 (4)id号为:25335的进程开始执行 (4)id号25335执行完毕,耗时8.498094秒 (5)id号为:25333的进程开始执行 (5)id号25333执行完毕,耗时9.061761秒 (6)id号为:25334的进程开始执行 (6)id号25334执行完毕,耗时8.845187秒 (7)id号为:25335的进程开始执行 (7)id号25335执行完毕,耗时6.623793秒 (8)id号为:25333的进程开始执行 (8)id号25333执行完毕,耗时2.530908秒 (9)id号为:25334的进程开始执行 (9)id号25334执行完毕,耗时9.739911秒 ------start------- ------end----------
- po.apply_async(func=download,args=(i,)) 执行的结果如下:你会发现开始是执行3个进程,之后只要有进程结束,等待的进程就会执行
-
------start------- (1)id号为:25313的进程开始执行 (2)id号为:25314的进程开始执行 (0)id号为:25315的进程开始执行 (0)id号25315执行完毕,耗时0.853286秒 (3)id号为:25315的进程开始执行 (3)id号25315执行完毕,耗时5.674426秒 (4)id号为:25315的进程开始执行 (4)id号25315执行完毕,耗时1.449967秒 (5)id号为:25315的进程开始执行 (1)id号25313执行完毕,耗时9.333982秒 (6)id号为:25313的进程开始执行 (2)id号25314执行完毕,耗时9.982127秒 (7)id号为:25314的进程开始执行 (5)id号25315执行完毕,耗时2.919765秒 (8)id号为:25315的进程开始执行 (7)id号25314执行完毕,耗时2.520782秒 (9)id号为:25314的进程开始执行 (6)id号25313执行完毕,耗时6.414589秒 (9)id号25314执行完毕,耗时7.013178秒 (8)id号25315执行完毕,耗时9.927967秒 ------end----------