什么是进程池
- 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,如果是上百个甚至上千个目标,收订的去创建进程的工作量巨大,此时就可以用到multiprocess模块提供的Pool方法
- 初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求
- 如果池中的进程数已经达到指定的最大值,那么该请求就会等待,知道池中有进程结束,才会用之前的进程来执行新的任务。
- 池子里面放的是进程,进程池会根据任务执行情况自耦东创建进程,而且尽量少创建进程,合理利用进程池中的进程完成多任务
python怎么使用进程池
import multiprocessing
import time
# 拷贝任务
def work():
print("复制中...", multiprocessing.current_process().pid)
time.sleep(0.5)
if __name__ == '__main__':
# 创建进程池
# 3:进程池中进程的最大个数
pool = multiprocessing.Pool(3)
# 模拟大批量的任务,让进程池去执行
for i in range(5):
# 循环让进程池执行对应的work任务
# 同步执行任务,一个任务执行完成以后另外一个任务才能执行
pool.apply(work)
复制中... 100512
复制中... 68128
复制中... 98924
复制中... 100512
复制中... 68128
解释
- 当程序第四次运行时,其实他的进程号和第一个程勋运行的是一样的,因为我之前就设定了最大的进程池数量为3,这样多个进程运行时,会以3位周期,进行循环的运行
- pool.apply()是同步执行进程
- 通过进程池创建的进程是守护主进程的状态
- 通过Process创建的进程是不会守护主进程的状态
进程的异步执行任务
- 进程池异步执行任务表示进程池中的进程同时执行任务,进程之间不会等待
- 上面已近说了进程池执行任务默认是守护主进程,所以需要所有的进程完成,需要对主进程进行阻塞
- 代码实例
小结
- apply(func[, args[, kwds]]): 阻塞方式调用函数,args表示以元组方式给函数传参,kwds表示以字典方式给函数传参
- apply_async(func[, args[, kwds]]) :使用非阻塞方式调用函数,args表示以元组方式给函数传参,kwds表示以字典方式给函数传参
- close():关闭Pool,使其不再接受新的任务;
- terminate():不管任务是否完成,立即终止;
- join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;