python 进程池

当需要创建子进程的数量不多的时候,可以直接利用multiprocessing 中的Process 动态生成多个进程,但如过有上百个或者上千个任务,手动创建工作量很大,此时我们就可以用到multiprocessing 下的Pool

#初始话Pool时,可以指定一个最大的进程数,当有背后的请求提交到Pool中时,如果池子还没有满,name就会创建一个新的进程来执行该请求,但如果满了(池子当中的进程已达到最大的数量),那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行

from multiprocessing import Pool

import os,time

#定义一个函数

def download(i):

    print("(%d)---------ID号为:%d的进程开始执行了"% (i,os.getpid()))

    t_satrt = time.time()



    t_stop = time.time()

    print("ID:%d执行完,耗时%f"%(os.getpid(),t_satrt-t_stop))



if __name__ == '__main__':

    po = Pool(2)#创建进程,里面的参数,就是最大的进程数量

    for i in range(10):

        # po.apply(func=download,args=(i,))
        po.apply_async(func=download,args=(i,))

    print('-----start------')
    po.close()#关闭进程池,关闭后就不在接受新的请求了
    po.join()#等待po中所有的子进程执行完成#也就是完成主进程的阻塞,必须要放在close之后
    print('__-----end------')

执行结果如下:

apply_async 是异步的,每次循环将会用空闲出来的子进程去调用目标,

apply 是同步,(自加阻塞)#也就是1执行完了才执行2,

-----start------
(0)---------ID号为:26043的进程开始执行了
(1)---------ID号为:26044的进程开始执行了
(2)---------ID号为:26045的进程开始执行了
ID:26043执行完,耗时-1.001076
(3)---------ID号为:26043的进程开始执行了
ID:26045执行完,耗时-1.001487
ID:26044执行完,耗时-1.001201
(4)---------ID号为:26044的进程开始执行了
(5)---------ID号为:26045的进程开始执行了
ID:26043执行完,耗时-1.000685
(6)---------ID号为:26043的进程开始执行了
ID:26044执行完,耗时-1.000378
(7)---------ID号为:26044的进程开始执行了
ID:26045执行完,耗时-1.001293
(8)---------ID号为:26045的进程开始执行了
ID:26043执行完,耗时-1.001278
(9)---------ID号为:26043的进程开始执行了
ID:26044执行完,耗时-1.001519
ID:26045执行完,耗时-1.003119
ID:26043执行完,耗时-1.001084
__-----end------
Process finished with exit code 0
#这里创建了三个进程

猜你喜欢

转载自blog.csdn.net/yang_bingo/article/details/80474227