Python并发编程之未来模块Futures

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按修改时间顺序排列文件的实例代码

    下面是详细讲解“python按修改时间顺序排列文件的实例代码”的完整攻略。 标题 目录 1. 实现思路 2. 示例说明 2.1 示例1 2.2 示例2 3. 代码实现 1. 实现思路 要实现按日期顺序排序文件,首先需要获取每个文件的修改日期,然后根据日期对文件列表进行排序。具体实现步骤如下: 使用os.listdir()获取目录中所有文件的文件名列表。 使用…

    python 2023年6月2日
    00
  • 65条最常用正则表达式 你要的都在这里了

    正则表达式是一种用于匹配字符串的模式,它可以用来检查字符串是否符合某种模式,或者从字符串中提取出符合某种模式的子串。下面是 65 条最常用的正则表达式,包括匹配数字、字母、空格、特殊字符等。 1. 匹配数字 匹配一个数字:\d 匹配一个或多个数字:\d+ 匹配零个或多个数字:\d* 匹配零个或一个数字:\d? 匹配一个非数字字符:\D 以下是一个使用正则表达…

    python 2023年5月14日
    00
  • centos 安装Python3 及对应的pip教程详解

    下面是详细的centos安装Python3及对应的pip教程详解: 准备工作 在安装Python3之前,有必要进行一些准备工作,如更新yum源和安装编译工具。 更新yum源 sudo yum -y update 安装必要的编译工具和库 sudo yum -y groupinstall ‘Development Tools’ sudo yum -y insta…

    python 2023年5月14日
    00
  • python反编译教程之2048小游戏实例

    Python反编译教程之2048小游戏实例 这是一篇关于如何通过反编译Python代码的教程,我们将使用2048小游戏作为示例。本文的主要目的是为了让初学者了解Python代码的编译和反编译过程,以及一些基本的反编译工具和技术。 准备工作 首先,我们需要准备好Python源代码以及相应的编译后的字节码文件。通常情况下,Python源代码的扩展名为.py,而编…

    python 2023年5月31日
    00
  • 使用python检查值是否已经存在于字典列表中

    当我们操作字典列表的时候,有时候需要检查某个值是否已经存在于字典列表中。在Python中,我们可以使用以下几种方式来实现这个功能: 方式一:使用循环遍历字典列表 当字典列表中的元素比较少时,我们可以使用循环遍历字典列表来检查某个值是否已经存在于字典列表中,具体步骤如下: # 定义一个字典列表 users = [ {‘name’: ‘Tom’, ‘age’: …

    python 2023年5月13日
    00
  • 使用python实现定时报天气的示例代码

    Python实现定时报天气攻略 天气是我们日常生活中非常重要的信息之一,使用Python可以方便地获取天气信息,并实现定时报天气的功能。本攻略将介绍使用Python实现定时报天气的示例代码,包括数据获取、数据处理、定时任务和示例。 步骤1:获取数据 在Python中,我们可以使用requests库获取天气数据。以下是获取天气数据的示例: import req…

    python 2023年5月15日
    00
  • Python使用re模块实现信息筛选的方法

    以下是详细讲解“Python使用re模块实现信息筛选的方法”的完整攻略,包括re模块的介绍、正则表达式的基本语法、代码实现、两个示例说明和注意事项。 re模块介绍 在Python中,re模块是用于处理正则表达式的模块。正则表达式是一种用于匹配字符串的模式,可以用于搜索、替换和验证。re模块提供了一系列函数,用于处理正则表达式,包括搜索、替换、分割和匹配等操作…

    python 2023年5月14日
    00
  • Django笔记三十四之分页操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十四之分页操作 这一篇笔记介绍一下如何在 Django 使用分页。 Django 自带一个分页的模块: from django.core.paginator import Paginator 主要用途是列表数据的切割,比如说有 3000 条用户数据,前端需要一个列表接口用于展示这些数据,但是一次…

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