先理解阻塞的概念 , 阻塞: 就是当本任务完成了,才能继续运行,后边的任务需要排队。
阻塞式的进程池的特点:
进程池:
pool = Pool(max) # 创建进程池对象
pool.apply() # 阻塞式
pool.apply_async() # 非阻塞式
pool.close()
pool.join() # 使主进程让步,主进程不能在进程结束前结束。
阻塞式进程用例:
from multiprocessing import Pool
import time,os
# 非阻塞式进程
from random import random
def task(task_name):
print('开始做任务啦!',task_name)
start = time.time()
# 使用sleep
time.sleep(random() * 2)
end = time.time()
print('完成任务:{}! 耗时:{} ,进程ID:{}'.format(task_name,(end-start),os.getpid()))
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐','看电影','读书','看报','玩游戏','打篮球','弹钢琴']
for t in tasks:
pool.apply(task,args=(t,))
pool.close() # 关闭进程池,不允许继续添加进程
pool.join() # 等待进程池中的所有进程结束
print('------'*10)
print('over!!!!!!!!!!')
输出结果:
开始做任务啦! 听音乐
完成任务:听音乐! 耗时:0.01780390739440918 ,进程ID:37187
开始做任务啦! 看电影
完成任务:看电影! 耗时:0.745894193649292 ,进程ID:37188
开始做任务啦! 读书
完成任务:读书! 耗时:0.6414411067962646 ,进程ID:37189
开始做任务啦! 看报
完成任务:看报! 耗时:0.40169405937194824 ,进程ID:37190
开始做任务啦! 玩游戏
完成任务:玩游戏! 耗时:1.446629285812378 ,进程ID:37191
开始做任务啦! 打篮球
完成任务:打篮球! 耗时:0.1841411590576172 ,进程ID:37187
开始做任务啦! 弹钢琴
完成任务:弹钢琴! 耗时:1.584665060043335 ,进程ID:37188
------------------------------------------------------------
over!!!!!!!!!!