1.阻塞式进程池
//
#阻塞式
#特点:
# 添加一个执行一个,加一个来一个,如果一个任务不结束另一个任务就进不来
#
#进程池:
# pool=Pool(max) 创建进程池对象
# pool.apply() 阻塞式进程
# pool.apply_async() 非阻塞式
#
# pool.close() 停止添加新的子进程
# pool.join() 让主进程让步,让子进程完成后再主进程
//
from multiprocessing import Pool
import time
import random
import os
def task(name):
print('我开始做任务了'+name)
start=time.time()
time.sleep(random.random()*2)
end=time.time()
print('完成任务:{}用时:{},进程id:{}'.format(name,end-start,os.getpid()))
# container=[]
# def callback_func(n):
# container.append(n)
if __name__ == '__main__':
pool=Pool(5)
tasks=['听音乐','吃饭','洗衣服','打游戏','五号任务','第六号任务','七号任务','八号任务']
for i in tasks:
pool.apply(task,args=(i,)) #apply是阻塞式,阻塞式不需要回调函数,因为他是执行完一个才进行下一个
pool.close()
print('over!!!!!!')
结果为
我开始做任务了听音乐
完成任务:听音乐用时:1.6573665142059326,进程id:25144
我开始做任务了吃饭
完成任务:吃饭用时:1.1927132606506348,进程id:9456
我开始做任务了洗衣服
完成任务:洗衣服用时:0.5656704902648926,进程id:26388
我开始做任务了打游戏
完成任务:打游戏用时:0.9807431697845459,进程id:17268
我开始做任务了五号任务
完成任务:五号任务用时:0.5586028099060059,进程id:14632
我开始做任务了第六号任务
完成任务:第六号任务用时:0.3072090148925781,进程id:25144
我开始做任务了七号任务
完成任务:七号任务用时:1.1672744750976562,进程id:9456
我开始做任务了八号任务
完成任务:八号任务用时:1.5571136474609375,进程id:26388
over!!!!!!
2.进程池之非阻塞式
//
#当需要创建子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程
#但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,这时候用multiprocessing模块中的Pool
#初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中,如果池中的进程数已经达到指定最大值,那么该进程就会等待,
知道池中有进程结束,才会创建新的进程来执行
#进程池的优点:进程池的限制,进程的复用
#Pool可以创建进程池,分阻塞式和非阻塞式
#阻塞式:添加一个执行一个,执