

在上次的文章Python基础篇 - 多进程-进程的创建我们认识了创建多进程的两种基本方式。而当我们需要大量进程的任务,手动实例化一个个进程未免太过繁琐,进程池就能很好地解决这个问题,进程池可以维护大量的进程。

一. apply()-进程池同步提交单个任务(效率低)
核心定义:向进程池提交单个任务,同步执行,提交任务后,主进程会等待该任务执行完毕,才能提交下一个任务,相当于排队做任务。
特点:无需手动获取结果(直接返回任务结果),但执行效率低,无法发挥进程池的并行优势,几乎不用在实际开发中。
# apply():同步执行,没有发挥多进程的优势from multiprocessing import Poolimport osimport time# 定义任务函数(模拟任务执行耗时)def task(num):time.sleep(1) # 模拟任务耗时1秒print(f"任务{num}执行中,进程ID:{os.getpid()}")return f"任务{num}执行完毕(进程ID:{os.getpid()})"if __name__ == "__main__":# 实例化进程池(设参数processes=2,2个进程,观察同步/并行)pool = Pool(processes=2)start_time = time.time() # 记录开始时间# 用apply()提交3个任务(逐个提交,同步执行)# task为对应函数,args传入对应的元组参数res1 = pool.apply(task, args=(1))res2 = pool.apply(task, args=(2))res3 = pool.apply(task, args=(3))# 关闭进程池,等待所有任务完成pool.close() # 关闭进程池pool.join() # 阻塞进程,等待所有进程执行完毕# 打印结果和总耗时print("任务结果:")print(res1, res2, res3)print(f"总执行时间:{time.time() - start_time:.2f}秒")# 始终是同一个进程id执行任务,总用时3秒
3个任务依次排队执行,每个任务耗时1秒,总耗时约3秒;且始终用同一个进程(进程ID不变),进程池的多个进程没有被充分利用。这就是同步执行的弊端,完全浪费了进程池的并行能力。
二. apply_async()-异步提交任务(效率高)
核心定义:向进程池提交任务,异步执行,提交任务后,主进程不等待该任务完成,继续提交下一个任务,进程池会自动分配空闲进程执行任务,相当于同时做多个任务。
特点:执行效率高,能充分发挥进程池的并行优势;但不会直接返回任务结果,需通过get()方法获取。
# apply_async()并发异步执行多个任务,提高效率from multiprocessing import Poolimport osimport time# 定义任务函数(模拟任务执行耗时)def task(num):time.sleep(1) # 模拟任务耗时1秒print(f"任务{num}执行中,进程ID:{os.getpid()}")return f"任务{num}执行完毕(进程ID:{os.getpid()})"if __name__ == "__main__":# 实例化进程池(设参数processes=2,2个进程,观察同步/并行)pool = Pool(processes=2)start_time = time.time()# 用apply_async()提交3个任务(异步执行,无需等待)# 提交任务后,返回结果对象(不是直接返回结果)res_obj1 = pool.apply_async(task, args=(1,))res_obj2 = pool.apply_async(task, args=(2,))res_obj3 = pool.apply_async(task, args=(3,))# 关闭进程池,等待所有任务完成pool.close() # 关闭进程池pool.join() # 阻塞进程,等待所有进程完毕# 通过get()方法获取每个任务的结果(get()会等待任务完成)res1 = res_obj1.get()res2 = res_obj2.get()res3 = res_obj3.get()# 打印结果和总耗时print("任务结果:")print(res1, res2, res3)print(f"总执行时间:{time.time() - start_time:.2f}秒")# 两个进程异步执行,并排跑,总用时大概2秒

总结:今日我们学习了Python基础篇-多进程-进程池。重点掌握进程池中apply()与apply_async()两种任务提交方法。apply()为同步执行,需排队等待任务完成,效率低、进程利用率低,仅适用于简单测试;apply_async()为异步执行,主进程无需等待,能充分利用进程池资源,效率高,是实际开发首选。在Python基础篇,后续我们将持续学习Python基础知识,介绍各种算法,祝每一位study er学习愉快。

