Python并发编程之未来模块Futures

yizhihongxing

Python并发编程之未来模块Futures

在Python 3中,concurrent.futures是处理异步任务和多线程任务的标准库。这个库包含两个类:ThreadPoolExecutor和ProcessPoolExecutor,它们使得编写并行代码变得容易。concurrent.futures模块提供了Future类来表示异步操作结果的一个简单方式。

Futures的基本概念

Future是异步编程的编程模型之一。简单地讲,Future是一个代理,用于访问尚未完成的操作的结果。Future对象可以被提交到ThreadPoolExecutor线程池中,每个Future对象表示一个尚未完成的操作,它会在未来的某个时间点被提交到线程池中执行。

因此,Future对于异步编程非常关键。使用Future,您可以避免阻塞您的主线程。当一个线程处于"等待结果"状态时,它会被挂起并释放CPU资源,以便其他线程可以使用它们。这样可以确保您的程序始终保持高效。

Future的用途

Future对于Python并发编程是非常有用的。它们可以用于异步I/O操作(如网络I/O、文件I/O、消息I/O等),也可以用于CPU密集型操作(如图像处理、数据分析等)。

当执行Futures时,它们会立即返回,不会阻塞主线程,因此主线程可以继续执行其他操作,当您需要结果时,您可以使用Future对象的result()方法获取它们(此时可能需要等待)。

示例1:使用ThreadPoolExecutor执行异步任务

首先,让我们看一个使用ThreadPoolExecutor的例子。我们使用ThreadPoolExecutor和Future对象创建一个异步任务来计算从1到1000的所有数字的总和,然后在计算完成后获取它的结果。

import concurrent.futures

def calculate_sum(num_list):
    return sum(num_list)

if __name__ == '__main__':
    num_list = list(range(1,1001))
    with concurrent.futures.ThreadPoolExecutor() as executor:
        future = executor.submit(calculate_sum, num_list)
        print(future.result())

代码解析:

  1. 首先,我们导入了concurrent.futures模块,并定义了一个名为“ calculate_sum”的函数,它将执行数字列表的总和
  2. 我们创建了数字列表num_list并将其传递给Future对象,我们将使用ThreadPoolExecutor来处理Future对象。
  3. 我们使用执行器executor的submit()方法将异步任务提交给ThreadPoolExecutor。submit方法返回一个Future对象,它代表的是已经提交的异步任务的结果(在本例中是数字列表的总和)。
  4. 最后,我们使用Future对象的result()方法获取异步任务的结果并打印它。

上面的代码非常简单,但这里有一些需要注意的事项:
- 当提交任务给Executor时,任务并没有立即执行,Executor内部会安排这些任务的执行。
- 使用with语句,可以在使用完后自动关闭线程池,释放资源。

示例2:使用ProcessPoolExecutor执行CPU密集型任务

现在我们来学习如何使用ProcessPoolExecutor,执行一个CPU密集型任务,并计算我们计算 Pi值的时间。因为这是一个CPU密集型任务,所以将使用ProcessPoolExecutor代替ThreadPoolExecutor。

import concurrent.futures
import time
import math

def calculate_pi(digits):
    pi = math.pi
    return format(pi, '.' + str(digits) + 'f')

if __name__ == '__main__':
    start = time.time()
    with concurrent.futures.ProcessPoolExecutor() as executor:
        future = executor.submit(calculate_pi, 100000)
        print(future.result())
    end = time.time()
    print('Time taken: {}s'.format(round(end-start, 2)))

代码解析:
1. 我们导入concurrent.futures模块和time,math模块。calculate_pi函数计算pi值并将其格式化为一个字符串。
2. 我们使用ProcessPoolExecutor代替ThreadPoolExecutor来处理CPU密集型任务。
3. 在开始计时之前,我们使用ProcessPoolExecutor的submit()方法将异步任务提交给ProcessPoolExecutor。
4. 我们使用Future对象的result()方法获取Pi计算的结果,并计算用于计算pi值的时间。

在本例中,我们使用Future对象执行了一个非常耗时的任务(计算100000位Pi值),但由于使用了ProcessPoolExecutor,我们的代码始终保持了高效。

结论

在Python3中,通过concurrent.futures模块内置的ThreadPoolExecutor和ProcessPoolExecutor线程池,通过submit()方法提交异步任务,并使用Future对象来获取任务的返回结果,能够让开发者更方便、更高效地进行并发编程的开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python并发编程之未来模块Futures - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解Python里使用正则表达式的ASCII模式

    详解Python里使用正则表达式的ASCII模式 在Python中,我们可以使用正则表达式来匹配文本。正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换、分割等。在正则表达式中,我们可以使用ASCII模式来匹配ASCII字符集中的字符。本攻略将详细讲解Python中使用正则表达式的ASCII模式,包括函数的用法、参数及值等。 正则表达式的基本语法 …

    python 2023年5月14日
    00
  • 创建巨大对象后,Python 在函数结束时挂起数小时

    【问题标题】:Python hangs for hours on end of functions after creating huge object创建巨大对象后,Python 在函数结束时挂起数小时 【发布时间】:2023-04-05 23:01:02 【问题描述】: 我有一个函数可以生成一个巨大的对象(大约 100-150Gb 的内存,在具有 500…

    Python开发 2023年4月6日
    00
  • python删除列表中特定元素的几种方法

    当我们需要从Python列表中删除特定元素时,有多种方法可以实现。下面将介绍Python删除列表中特定元素的几种方法,包括使用remove()方法、列表推导式、使用filter()函数等。 使用remove()方法删除特定元素 remove()方法可以删除列表中特定的元素。例如: # 使用remove()方法删除特定元素 lst = [1, 2, 3, 4,…

    python 2023年5月13日
    00
  • 最新Pygame zero最全集合

    最新Pygame zero最全集合攻略 Pygame Zero是一款基于Python编程语言的2D游戏引擎,为开发者提供了一个简单易用的方式来创建小型的游戏项目。本文将介绍最新的Pygame zero集合,帮助您快速入门。 安装 Pygame Zero需要在Python环境下运行,因此请确保您已经安装了Python。使用pip命令来安装Pygame Zero…

    python 2023年5月14日
    00
  • Python:在迭代时将元素添加到列表中

    【问题标题】:Python: Adding element to list while iteratingPython:在迭代时将元素添加到列表中 【发布时间】:2023-04-02 14:30:01 【问题描述】: 我知道在迭代列表时不允许删除元素,但是否允许在迭代时将元素添加到 python 列表中。这是一个例子: for a in myarr: if …

    Python开发 2023年4月8日
    00
  • Python – 请求提取 HTML 而不是 JSON – 2020 版

    【问题标题】:Python – Requests pulling HTML instead of JSON – 2020 editionPython – 请求提取 HTML 而不是 JSON – 2020 版 【发布时间】:2023-04-04 18:20:01 【问题描述】: 我想通过请求的内置 json 解析器从银行的公共 API 服务中提取一些汇率值。…

    Python开发 2023年4月6日
    00
  • Python读取excel指定列生成指定sql脚本的方法

    Python读取excel指定列生成指定sql脚本的方法可以通过以下步骤实现: 安装依赖库 在 Python 环境下,我们需要安装 pandas 和 openpyxl 库。可以通过以下命令来安装: pip install pandas openpyxl 读取excel文件 使用 pandas 库中的 read_excel 函数读取excel文件。例如,我们有…

    python 2023年5月14日
    00
  • python实现linux下使用xcopy的方法

    当需要在Linux环境中使用Windows的xcopy命令进行文件复制时,可以通过Wine或是Python来实现。 下面我们讲解一下如何使用Python实现Linux下使用xcopy的方法: 1. 安装Python 如果你还没安装Python,可以参考以下步骤进行安装: 在Linux中执行以下命令: sudo apt-get update sudo apt-…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部