广告位联系
返回顶部
分享到

python中concurrent.futures的具体使用

python 来源:互联网 作者:佚名 发布时间:2024-09-20 16:37:58 人浏览
摘要

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

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

1. concurrent.futures 概述

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

ThreadPoolExecutor:用于管理线程池。

ProcessPoolExecutor:用于管理进程池。

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

2. 核心 API

2.1 concurrent.futures.Executor

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

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

  • 提交一个函数给执行器,函数会在独立的线程或进程中执行。返回一个 Future 对象。
  • 场景:当你需要执行一个后台任务并获取结果时使用。

1

2

3

4

5

6

7

8

from concurrent.futures import ThreadPoolExecutor

 

def square(n):

    return n * n

 

with ThreadPoolExecutor() as executor:

    future = executor.submit(square, 10)

    print(future.result())  # 输出: 100

提交一个函数给执行器,函数会在独立的线程或进程中执行。返回一个 Future 对象。

场景:当你需要执行一个后台任务并获取结果时使用。

map(func, *iterables, timeout=None, chunksize=1):

  • 将一个函数应用于一个或多个迭代器中的每个元素,并行地执行。类似于内置的 map() 函数,但它会并行执行。
  • 场景:当你有一组数据需要并行处理时使用。

1

2

3

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,则会取消所有未开始的任务。
  • 场景:当你需要优雅地关闭执行器时使用。

1

executor.shutdown(wait=True)

2.2 concurrent.futures.Future

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

result(timeout=None):

  • 获取任务的结果,如果任务还未完成,则会等待。你可以设置一个超时时间。
  • 场景:当你需要获取异步任务的执行结果时使用。

1

result = future.result(timeout=5)  # 等待最多5秒

exception(timeout=None):

  • 如果任务抛出了异常,则返回该异常对象,否则返回 None。
  • 场景:当你想处理任务中的异常时使用。

1

2

3

4

try:

    result = future.result()

except Exception as e:

    print(f"Error occurred: {e}")

done():

  • 检查任务是否已完成。
  • 场景:当你想知道任务是否已经完成时使用。

1

2

if future.done():

    print("Task is completed.")

add_done_callback(fn):

  • 为 Future 对象添加一个回调函数,当任务完成时会自动调用此回调。
  • 场景:当你需要在任务完成后自动触发某些操作时使用。

1

2

3

4

def on_done(fut):

    print(f"Task done with result: {fut.result()}")

 

future.add_done_callback(on_done)

3. ThreadPoolExecutor 与 ProcessPoolExecutor

3.1 ThreadPoolExecutor

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

1

2

with ThreadPoolExecutor(max_workers=5) as executor:

    future = executor.submit(square, 10)

参数说明:

max_workers:最大并发线程数。

3.2 ProcessPoolExecutor

进程池执行器,用于管理进程。适用于 CPU 密集型任务,如计算密集型操作。

1

2

3

4

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 来并行执行这些任务,从而减少总的等待时间。

1

2

3

4

5

6

7

8

9

10

11

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 提高效率。

1

2

3

4

5

6

7

8

9

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 密集型)来决定。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python中xml.etree.ElementTree的使用
    xml.etree.ElementTree(简称ElementTree)是Python标准库中用于处理XML文件的模块。它提供了简洁且高效的API,适用于解析、创建和修改XML文档。在需
  • python中concurrent.futures的具体使用
    concurrent.futures是 Python 标准库中用于并行编程的高级模块,它提供了一种高级别的接口来管理线程和进程。通过这个模块,你可以轻松地利用
  • Python中跳出循环的两种方法

    Python中跳出循环的两种方法
    我们经常遇到循环在进行到某一个特定的值时,需要跳出循环,或跳过这个值,python中早已为我们准备了这样的参数:break,continue 比如下面的
  • 解决Python调用df.to_csv()出现中文乱码的问题

    解决Python调用df.to_csv()出现中文乱码的问题
    Python调用df.to_csv()出现中文乱码 1 2 3 4 df = pd.DataFrame(data=total_info, columns=[公司全名, 公司简称, 公司规模, 融资阶段, 区域, 职位名称, 工作经验
  • PyTorch池化层详解及作用

    PyTorch池化层详解及作用
    在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时
  • python实现列表推导式与生成器的介绍
    列表推导式和生成器是 Python 中的两个非常有用的工具。它们可以帮助你以简洁和高效的方式创建和处理数据集合。了解它们的用法不仅可以
  • python关于图片和base64互转的三种方式

    python关于图片和base64互转的三种方式
    通过cv2进行转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import cv2 import base64 import numpy as np def img_to_base64(img_array): # 传入图片为RGB格式numpy矩阵,
  • Python虚拟环境virtualenv安装的详细教程保姆级(Wi

    Python虚拟环境virtualenv安装的详细教程保姆级(Wi
    虚拟环境安装 工作中我们经常会根据不同的项目切换不同的python环境,如果仅仅是在本地就安装一个python环境,项目移植也要重新配置环境
  • python中eval的用法介绍

    python中eval的用法介绍
    python中eval的用法 eval(字符串) 能够以Python表达式的方式解析并执行字符串,并将返回结果输出。 eval()函数将去掉字符串的两个引号,将其解
  • Python使用切片移动元素位置的代码
    一.基本介绍 1.切片基础 在 Python 中,切片是指从序列类型(如列表、字符串、元组等)中提取子序列的过程。切片的基本语法如下: 1 seq
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计