首页 > 编程语言 >python——concurrent.futures

python——concurrent.futures

时间:2024-08-22 20:24:58浏览次数:15  
标签:python futures concurrent 任务 result executor ThreadPoolExecutor

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 ThreadPoolExecutor
    
    def square(n):
        return n * n
    
    with 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 ProcessPoolExecutor
    
    with ProcessPoolExecutor(max_workers=5) as executor:
        future = executor.submit(square, 10)
    
    • 参数说明
      • max_workers:最大并发进程数。

4. 使用场景

4.1 I/O 密集型任务

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

import requests

def fetch_url(url):
    response = requests.get(url)
    return response.status_code

urls = ['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 n
    else:
        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,futures,concurrent,任务,result,executor,ThreadPoolExecutor
From: https://blog.csdn.net/pumpkin84514/article/details/141404702

相关文章

  • 【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站
    目录: 系统简介:  关键技术介绍2.1PYTHON语言简介2.2MySql数据库2.3DJANGO框架2.4Hadoop介绍2.5Scrapy介绍2.6B/S架构 系统总功能结构设计系统详细实现:6系统测试系统测试的目的软件测试过程测试用例为什么选择我: 博主介绍:  ✌我是阿龙,一名......
  • Python系列(7)| 命名空间、作用域
     1.命名空间(Namespace)   Python中的命名空间(Namespace)和作用域是密切相关的概念。Python命名空间(Namespace)可以视为一个字典,其中键是变量名,值是与之关联的对象。   各个命名空间是独立的,同一个命名空间中不能有重名(重名的以后一个为准),不同的命名空间是......
  • PCA原理与水果成熟状态数据分析实例:Python中PCA-LDA 与卷积神经网络CNN
    全文链接:https://tecdat.cn/?p=37450 主成分分析(PCA)作为数据科学中用于可视化和降维的重要工具,在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本1000页的书,而更倾向于2到3页的总结以抓住整体概貌一样,当数据集中特征过多时,PCA可以帮助我们减少维度,提......
  • python 04-标准库:pathlib模块
    pathlib模块pathlib模块‌:是面向对象的文件系统路径操作库,提供接口来处理文件路径。Path是主类Path:Path对象表示文件或目录的路径,Path类会自动选择PosixPath或WindowsPath,具体取决于我们的操作系统......
  • Python系列(6)- Python 函数、Python 装饰器
    函数在数学上的定义:给定一个非空的数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A),那么这个关系式就叫函数关系式,简称函数。简而言之,两个变量x和y,如果每给定x的一个值,y都有一个确定的值与其对应,那么我们就说y是x的函数。其中,x叫做自变量,y叫做因变量......
  • python03-标准库 第三方库-pathlib模块
    python标准库:Python自带的一组模块和库,这些模块和库提供了Python编程所需的基础功能和工具https://docs.python.org/zh-cn/3/library/index.html?eqid=8ca0b3ea000067990000000264800802Python包索引:即PyPI(PythonPackageIndex),是一个仓库,存放了许多可以通过pip安装的独......
  • python模块之psutil
    模块介绍psutil是一个Python的跨平台库,用于获取系统和进程的运行状态以及实时信息。它能够方便地访问系统的CPU、内存、磁盘、网络等资源的使用情况。此外,psutil也能够管理和监控进程,非常适合用于系统监控和性能分析等应用。psutil库适用于Python3.x版本,自版本5.0.0起......
  • Python中matplotlib使用4
    在matplotlib中,可以通过绘制“饼图”来展示各类别在总体中所占的比例。1绘制基本“饼图”通过matplotlib中的pie()函数绘制饼图,代码如图1所示。图1绘制基本“饼图”的代码从图1中可以看出,pie()函数的参数y即为要绘制的数据,绘制出的“饼图”如图2所示。图2基本“饼图......
  • Python中定义和使用类的私有属性和方法
    类的私有属性和方法指的是只能在类的内部使用,而不能在类外使用的属性和方法。1单下划线方式在定义类的属性和方法时,在名字前面加一个下划线,此时表示该属性或方法只能在类的内部使用,而不能在类的外部使用,代码如图1所示。图1定义类的私有属性从图1中可以看出,在类Myclass中......
  • Python中类的使用4
    在Python中,如果要编写的类是另一个类的特殊版本,可以使用继承。一个类A继承另一个类B,类A将自动获得类B的所有属性和方法,类B叫做父类,而类A叫做子类。假设有一个类是表示“人”的类,而另一个类是表示“学生”的类,因为“学生”是“人”的特殊版本,因此可以把表示“人”的类当作父类,表......