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()

![04_进程池[Python常见问题]](https://www.zixueka.com/wp-content/uploads/2023/10/1696934672-2ea369526fe3c5d.jpg)
