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

python——concurrent.futures

concurrent.futures 是 Python 标准库中用于并行编程的高级模块,它提供了一种高级别的接口来管理线程和进程。通过这个模块,你可以轻松地利用多线程和多进程来并行执行任务,进而提高程序的执行效率。

1. concurrent.futures 概述

concurrent.futures 提供了两种执行器类型:

  • ThreadPoolExecutor:用于管理线程池。
  • ProcessPoolExecutor:用于管理进程池。

这两种执行器都实现了同样的接口,因此你可以使用相同的代码逻辑来管理线程和进程。

2. 核心 API

2.1 concurrent.futures.Executor

Executor 是一个抽象基类,它定义了任务提交和管理的核心接口。以下是 Executor 提供的主要方法:

  • submit(fn, *args, **kwargs)

    • 提交一个函数给执行器,函数会在独立的线程或进程中执行。返回一个 Future 对象。
    • 场景:当你需要执行一个后台任务并获取结果时使用。
    from concurrent.futures import ThreadPoolExecutordef square(n):return n * nwith ThreadPoolExecutor() as executor:future = executor.submit(square, 10)print(future.result())  # 输出: 100
    
  • map(func, *iterables, timeout=None, chunksize=1)

    • 将一个函数应用于一个或多个迭代器中的每个元素,并行地执行。类似于内置的 map() 函数,但它会并行执行。
    • 场景:当你有一组数据需要并行处理时使用。
    with ThreadPoolExecutor() as executor:results = executor.map(square, range(10))print(list(results))  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
  • shutdown(wait=True, cancel_futures=False)

    • 释放执行器资源。如果 wait=True,则会等待所有提交的任务完成;如果 cancel_futures=True,则会取消所有未开始的任务。
    • 场景:当你需要优雅地关闭执行器时使用。
    executor.shutdown(wait=True)
    
2.2 concurrent.futures.Future

Future 对象用于表示异步执行的任务结果。以下是 Future 提供的主要方法:

  • result(timeout=None)

    • 获取任务的结果,如果任务还未完成,则会等待。你可以设置一个超时时间。
    • 场景:当你需要获取异步任务的执行结果时使用。
    result = future.result(timeout=5)  # 等待最多5秒
    
  • exception(timeout=None)

    • 如果任务抛出了异常,则返回该异常对象,否则返回 None
    • 场景:当你想处理任务中的异常时使用。
    try:result = future.result()
    except Exception as e:print(f"Error occurred: {e}")
    
  • done()

    • 检查任务是否已完成。
    • 场景:当你想知道任务是否已经完成时使用。
    if future.done():print("Task is completed.")
    
  • add_done_callback(fn)

    • Future 对象添加一个回调函数,当任务完成时会自动调用此回调。
    • 场景:当你需要在任务完成后自动触发某些操作时使用。
    def on_done(fut):print(f"Task done with result: {fut.result()}")future.add_done_callback(on_done)
    

3. ThreadPoolExecutorProcessPoolExecutor

3.1 ThreadPoolExecutor
  • 线程池执行器,用于管理线程。适用于 I/O 密集型任务,如文件操作、网络请求等。

    with ThreadPoolExecutor(max_workers=5) as executor:future = executor.submit(square, 10)
    
    • 参数说明
      • max_workers:最大并发线程数。
3.2 ProcessPoolExecutor
  • 进程池执行器,用于管理进程。适用于 CPU 密集型任务,如计算密集型操作。

    from concurrent.futures import ProcessPoolExecutorwith ProcessPoolExecutor(max_workers=5) as executor:future = executor.submit(square, 10)
    
    • 参数说明
      • max_workers:最大并发进程数。

4. 使用场景

4.1 I/O 密集型任务

场景:当你有多个需要等待 I/O 操作(如文件读取、网络请求)的任务时,可以使用 ThreadPoolExecutor 来并行执行这些任务,从而减少总的等待时间。

import requestsdef fetch_url(url):response = requests.get(url)return response.status_codeurls = ['https://www.example.com', 'https://www.google.com', 'https://www.github.com']with ThreadPoolExecutor(max_workers=3) as executor:results = executor.map(fetch_url, urls)print(list(results))
4.2 CPU 密集型任务

场景:当你有多个需要大量计算的任务时,可以使用 ProcessPoolExecutor 来并行执行,从而充分利用多核 CPU 提高效率。

def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)with ProcessPoolExecutor(max_workers=3) as executor:results = executor.map(fibonacci, range(10, 20))print(list(results))

5. 总结

concurrent.futures 提供了一个方便的接口来管理多线程和多进程的并发执行。通过理解和使用这些 API,你可以更有效地编写并行程序,提高程序的执行效率。在选择使用 ThreadPoolExecutor 还是 ProcessPoolExecutor 时,应根据任务的性质(I/O 密集型或 CPU 密集型)来决定。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SAP凭证分割【Document Splitting】
  • wsl2 airsim wairing for connect (Windows11 UE4.27)问题解决
  • 惠海H4312 dcdc同步整流降压恒压IC 30V 40V转3.3V/5V/12V小体积大电流单片机供电
  • Zimg:轻量级图片服务器的高性能解决方案
  • C# Stack
  • Spring的核心启动流程
  • yas源码解析 之 hexdump打印二进制
  • PostgreSQL的pg_dump中 --inserts参数测试
  • 随机优化中基于任务的端到端模型学习
  • 为什么使用网络请求时,遇到 HTTP 请求返回 404(Not Found)错误,而使用 HTTPS 请求则正常工作
  • 蛇优化算法(Snake Optimization, SO)优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)
  • 建筑楼宇电气安全与能效管理
  • 【JVM】JVM解析字节码文件过程(一)
  • Vue条件判断:v-if、v-else、v-else-if、v-show 指令
  • MySQL 升级:MySQL Server 变更详解 (8.0.36 ~ 8.0.37)
  • [NodeJS] 关于Buffer
  • 10个确保微服务与容器安全的最佳实践
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • ECMAScript6(0):ES6简明参考手册
  • JavaScript实现分页效果
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • python学习笔记-类对象的信息
  • Vue2.0 实现互斥
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 离散点最小(凸)包围边界查找
  • 前端学习笔记之观察者模式
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小李飞刀:SQL题目刷起来!
  • 选择阿里云数据库HBase版十大理由
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #{}和${}的区别?
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)VC++中ondraw在什么时候调用的
  • (转载)利用webkit抓取动态网页和链接
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • (自用)仿写程序
  • .NET Framework杂记
  • .net Stream篇(六)
  • .net 获取某一天 在当月是 第几周 函数
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET项目中存在多个web.config文件时的加载顺序
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @Transactional 竟也能解决分布式事务?
  • @vue/cli脚手架
  • [20180224]expdp query 写法问题.txt