项目代码工程优化之concurrent.futures异步编程(二)
ProcessPoolExecutor
是 concurrent.futures
模块中的一个类,用于实现多进程并发执行任务。它通过创建和管理一个进程池,将工作负载分配给多个进程,从而提高 CPU 密集型任务的执行效率。与 ThreadPoolExecutor
不同,ProcessPoolExecutor
适用于 CPU 密集型任务,因为它可以绕过 Python 的全局解释器锁(GIL),从而充分利用多核 CPU 的计算能力 。
ProcessPoolExecutor
的基本用法
-
创建进程池
使用ProcessPoolExecutor
创建一个进程池,可以通过指定max_workers
参数来设置最大同时运行的进程数。如果不指定,max_workers
默认为 CPU 核心数。from concurrent.futures import ProcessPoolExecutorwith ProcessPoolExecutor(max_workers=4) as executor:# 提交任务到进程池futures = [executor.submit(task, i) for i in range(4)]
-
提交任务
使用submit
方法将任务提交到进程池,返回一个Future
对象。Future
对象可以用来跟踪任务的状态和结果。def task(n):return n * nwith ProcessPoolExecutor() as executor:future = executor.submit(task, 3)print(future.result()) # 输出: 9
-
等待任务完成
使用as_completed
函数来迭代Future
对象,当任务完成时返回结果。def task(n):return n * nwith ProcessPoolExecutor() as executor:futures = [executor.submit(task, i) for i in range(4)]for future in as_completed(futures):print(future.result()) # 输出: 0, 1, 4, 9
-
处理异常
在任务执行过程中可能会抛出异常,可以通过Future
对象的exception()
方法来捕获并处理异常。def task(n):if n == 3:raise ValueError("Error occurred")return n * nwith ProcessPoolExecutor() as executor:futures = [executor.submit(task, i) for i in range(4)]for future in as_completed(futures):try:print(future.result())except Exception as e:print(f"An error occurred: {e}")
-
使用
map
方法
map
方法可以将函数和可迭代对象映射在一起,异步执行多个任务。def task(n):return n * nwith ProcessPoolExecutor() as executor:results = executor.map(task, range(4))for result in results:print(result) # 输出: 0, 1, 4, 9
-
设置回调函数
可以为Future
对象设置回调函数,当任务完成时自动调用该回调函数。def callback(future):print(f"Task completed with result: {future.result()}")def task(n):return n * nwith ProcessPoolExecutor() as executor:futures = [executor.submit(task, i) for i in range(4)]for future in futures:future.add_done_callback(callback)
ProcessPoolExecutor
的特点
- 进程池管理:
ProcessPoolExecutor
提供了高级 API 来管理进程池和执行并发任务,简化了多进程编程的复杂性 。 - 资源管理:通过
with
语句可以确保进程池在使用后正确关闭,避免资源泄漏。 - 异常处理:
Future
对象提供了exception()
方法,可以方便地捕获和处理任务执行中的异常 。 - 回调机制:
add_done_callback
方法允许注册回调函数,当任务完成时自动调用,增强了程序的灵活性和响应性 。
ProcessPoolExecutor
的适用场景
- CPU 密集型任务:如科学计算、图像处理、数据加密等,这些任务需要充分利用多核 CPU 的计算能力。
- 并行计算:如并行排序、并行搜索等,可以显著提高程序的执行效率 。
总结
ProcessPoolExecutor
是 concurrent.futures
模块中用于实现多进程并发执行任务的类。它通过创建和管理一个进程池,将工作负载分配给多个进程,从而提高 CPU 密集型任务的执行效率。通过 submit
、map
、as_completed
等方法,可以方便地提交任务、等待任务完成和处理任务结果。同时,ProcessPoolExecutor
提供了异常处理和回调机制,增强了程序的健壮性和灵活性。