python——concurrent.futures

2024-08-22 03:52
文章标签 python futures concurrent

本文主要是介绍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 密集型)来决定。

这篇关于python——concurrent.futures的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095160

相关文章

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python