当前位置: 首页 > java >正文

项目代码工程优化之concurrent.futures异步编程(二)

ProcessPoolExecutorconcurrent.futures 模块中的一个类,用于实现多进程并发执行任务。它通过创建和管理一个进程池,将工作负载分配给多个进程,从而提高 CPU 密集型任务的执行效率。与 ThreadPoolExecutor 不同,ProcessPoolExecutor 适用于 CPU 密集型任务,因为它可以绕过 Python 的全局解释器锁(GIL),从而充分利用多核 CPU 的计算能力 。

ProcessPoolExecutor 的基本用法

  1. 创建进程池
    使用 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)]
    
  2. 提交任务
    使用 submit 方法将任务提交到进程池,返回一个 Future 对象。Future 对象可以用来跟踪任务的状态和结果。

    def task(n):return n * nwith ProcessPoolExecutor() as executor:future = executor.submit(task, 3)print(future.result())  # 输出: 9
    
  3. 等待任务完成
    使用 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
    
  4. 处理异常
    在任务执行过程中可能会抛出异常,可以通过 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}")
    
  5. 使用 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
    
  6. 设置回调函数
    可以为 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 的计算能力。
  • 并行计算:如并行排序、并行搜索等,可以显著提高程序的执行效率 。

总结

ProcessPoolExecutorconcurrent.futures 模块中用于实现多进程并发执行任务的类。它通过创建和管理一个进程池,将工作负载分配给多个进程,从而提高 CPU 密集型任务的执行效率。通过 submitmapas_completed 等方法,可以方便地提交任务、等待任务完成和处理任务结果。同时,ProcessPoolExecutor 提供了异常处理和回调机制,增强了程序的健壮性和灵活性。

http://www.xdnf.cn/news/9436.html

相关文章:

  • 加密协议知多少
  • 【前端】PWA
  • Hadoop复习(二)
  • 网络协议入门:TCP/IP五层模型如何实现全球数据传输?
  • C++学习之STL学习:vector类的使用
  • flutter常用动画
  • c++ 调用opencv或pcl流程
  • 【Tomcat】Tomcat端口仅允许本地访问设置方法
  • 接地气的方式认识JVM(一)
  • i2c-tools使用的介绍及示例(i2cdetect,i2cdump, i2cget、i2cset、i2ctransfer)
  • 解决微信小程序中 Flex 布局下 margin-right 不生效的问题
  • 通用大数据可视化展示平台模板 – 免费HTML源码
  • 聊聊JVM怎么调优?(实战总结)
  • 【Doris基础】Apache Doris中FE和BE的职责详解
  • 端午节互动网站
  • 学习threejs,超炫银河黑洞效果模拟
  • 【Halcon】 affine_trans_image 算子详解
  • vue组件和插件的区别
  • Kafka KRaft + SSL + SASL/PLAIN 部署文档
  • 【剑指offer】链表 系列
  • 万字详解RTR RTSP SDP RTCP
  • DeepSeek R1模型已完成小版本试升级
  • Unity屏幕适配——背景适配
  • leetcode 3372. 连接两棵树后最大目标节点数目 I
  • P8-大模型微调
  • Day05
  • Vuer开源程序 是一个轻量级的可视化工具包,用于与动态 3D 和机器人数据进行交互。它支持 VR 和 AR,可以在移动设备上运行。
  • Ethan的日记5/28
  • leetcode0670. 最大交换-medium
  • 让 Deepseek GPS测速