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的话脚本就会停止运行

 运行

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

posted @ 2018-01-07 19:26  Sch01aR#  阅读(365)  评论(0编辑  收藏  举报