Python 多进程编程之multiprocessing--Pool

Python 多进程编程之multiprocessing--Poolpython

----当须要建立的子进程数量很少的时候,能够直接利用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----------
    
相关文章
相关标签/搜索