Python-multiprocessing.Pool异步线程池

'''
当需要创建的子进程数量不多的时候可以直接利用multiprocessing中的Process动态生成多个进程
但是,如果是成百上千个任务,手动创建显然不合适,此时就可以用multiprocessing下的Pool类完成

初始化Pool时,可以指定一个最大的进程数,当有新的请求提交到Pool中时,如果池子还没有满,
(即对进程进行有效的管理)那么会创建一个新的进程来执行该请求,如果进程数达到最大数量时,
再请求时就会等待Pool中有空余进程可用,直到池中有进度结束,才会创建新的进程来执行,类似停满的停车场

Pool中自动创建和回收进程
po.apply_async()/po.apply()就开始想Pool中添加任务
'''
from multiprocessing import Pool
import time,os,random

#定义一个函数
def download(i):
    print('%d--ID号为:%d的进程开始执行'%(i,os.getpid()))
    t_start=time.time()
    #time.sleep(2)
    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):#假设有10个文件要下载
        #同步,自加阻塞
        #po.apply(func=download,args=(i,))#将请求放进进程池中执行,属于阻塞式请求,一个进程执行完毕后才会执行第二个进程
                                # 不能体现同时处理三个三个请求
                                #也就是不能体现并发
        #每次循环将会用空闲出来的子进程去调用任务---异步
        po.apply_async(func=download,args=(i,))#异步体现并发,三个进程都在执行任务,其中一个执行完毕后,下一个补上继续执行
    print('----start-----')

    #调用join之前,先调用close函数,否则会出错。
    po.close()#关闭进程池,关闭后就不再接受新的请求,即开始执行任务。
    po.join()## join函数等待所有子进程结束,才会执行主进程之后的代码
    print('-----end------')
 
  

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/apple/PycharmProjects/stage4/Pool/p01.py
----start-----
0--ID号为:14470的进程开始执行
1--ID号为:14471的进程开始执行
2--ID号为:14472的进程开始执行
0--ID:14470执行完毕,耗时:0.106574秒
3--ID号为:14470的进程开始执行
3--ID:14470执行完毕,耗时:0.598842秒
4--ID号为:14470的进程开始执行
2--ID:14472执行完毕,耗时:1.881678秒
5--ID号为:14472的进程开始执行
4--ID:14470执行完毕,耗时:3.396029秒
6--ID号为:14470的进程开始执行
1--ID:14471执行完毕,耗时:4.769184秒
7--ID号为:14471的进程开始执行
7--ID:14471执行完毕,耗时:3.460111秒
8--ID号为:14471的进程开始执行
6--ID:14470执行完毕,耗时:4.486360秒
9--ID号为:14470的进程开始执行
5--ID:14472执行完毕,耗时:7.309101秒
8--ID:14471执行完毕,耗时:2.280377秒
9--ID:14470执行完毕,耗时:6.201162秒
-----end------


Process finished with exit code 0

你可能感兴趣的:(Python进程,multiprocessing,Pool,同步与异步)