04_进程池
1.为什么用进程池
1.在需要频繁的创建删除较多进程的情况下,导致计算机资源消耗过多
2.进程池则是创建指定进程数量等待执行事件,避免了不必要的创建和销毁过程
2.进程池的使用步骤
1.创建进程池,在池内放入适量的进程,将事件加入进程池的等待队列
2.使用进程池中的进程不断处理事件,所有事件处理后回收关闭进程池
3.语法概述
from multiprocessing import Pool pool = Pool(processes=4) # 创建指定进程数量进程池并返回进程池对象 # 异步方式将事件放入进程池执行,返回一个对象该对象 # callback: 回调函数,每当进程池中的进程处理完任务了,返回的结果交给回调函数,由回调函数进一步处理,回调函数只有异步时才有 ret = pool.apply_async(func, args=(), kwds={}, callback=None, error_callback=None) 参数: func要执行的事件函数,可以通过返回值对象的 ret.get() 方法得到func函数的返回值 args: 位置参数元组,要给函数传递的参数 kwargs: 键值对参数字典,要给函数传递的参数 callback: 进程的任务函数返回值被当做回调函数的形参接收到,以此进行进一步的处理操作,回调函数是主进程调用的 error_callback: 错误时主进程执行的回调函数 pool.close() # 关闭进程池,使其无法加入新的事件 pool.join() # 阻塞等待进程池退出(当所有事情处理完毕后) pool.apply() # 用法和 pool.apply_async() 一样,但是没有返回值,异步方式将事件放入进程池顺序执行,一个事件结束再执行另一个事件 func_list = pool.map(func, iter) # 类似于内建函数map,将第二个参数的迭代数传递给第一个参数的函数执行,同时兼容了使用进程池执行 # 示例: from multiprocessing import Pool import time def fun(num): time.sleep(1) return num * num test = [1, 2, 3, 4, 5, 6] pool = Pool(3) r = pool.map(fun, test) # 返回fun函数的返回值列表 # 上面折行代码等同于以下注释部分的代码 # r = [] # for i in test: # res = pool.apply_async(fun, (i,)) # r.append(res.get()) print(r) pool.close() pool.join()