• Python 多进程编程之multiprocessing--Pool


    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----------
      
  • 相关阅读:
    Codeforces Round #415 (Div. 2) C. Do you want a date?
    Lifting the Stone 计算几何 多边形求重心
    计算几何 多边形面积 和 重心 的求法
    POJ 3304 segments 线段和直线相交
    LibreOJ #114. k 大异或和
    LibreOJ #113. 最大异或和
    对于各种各样平衡树的比较
    数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
    替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
    红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
  • 原文地址:https://www.cnblogs.com/Fantinai/p/8428579.html
Copyright © 2020-2023  润新知