• Python多进程-进程池


    进程池可以减轻多进程对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的话脚本就会停止运行
    

     运行

    进程池中的回调函数是主进程启动执行的,所以进程号是一样的

  • 相关阅读:
    Window frames[]集合(转)
    ObjectDataSource 如何传递查询参数
    前台如何解析json格式 以及后台如何生成json格式
    Burrows–Wheeler transform
    windows xp中安装PadWalker
    ORA01207:文件比控制文件更新 旧的控制文件
    如何看懂NCBI BLAST输出结果
    Perl getopts
    blast formatdb 使用方法介绍
    Randfold安装
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8231003.html
Copyright © 2020-2023  润新知