Python Contextvars 模块2024 年 8 月 29 日 | 5 分钟阅读 Python 是一种流行的、高级的编程语言,在从 Web 开发到科学计算的各个行业和领域都有应用。Python 的众多模块之一是 contextvars 模块,该模块于 Python 3.7 中引入。 contextvars 模块提供了一种在 Python 中管理上下文本地状态的方法。这意味着您可以定义一个与特定上下文或执行上下文关联的变量,该变量的值将可供在该上下文内运行的所有代码使用。在本文中,我们将更详细地探讨 contextvars 模块,并讨论它如何在 Python 编程中使用。 Python 中的上下文是什么?在深入研究 contextvars 模块之前,让我们先定义一下 Python 中的“上下文”意味着什么。上下文只是一组条件,用于定义在其中执行特定代码块的环境。这些条件可以包括当前的执行线程、当前用户或当前数据库连接等。 在 Python 中,上下文通常通过上下文管理器与特定代码块相关联。上下文管理器是一个定义在代码块执行之前和之后应发生的行为的对象。例如,内置的 Python 函数 open() 返回一个可用于管理文件打开和关闭的上下文管理器。 以下是在 Python 中使用上下文管理器打开文件的示例 在此代码中,with 语句建立了一个上下文,在该上下文中,文件 example.txt 以写入模式打开。open() 函数返回一个负责管理文件资源的上下文管理器。当退出块时(无论是正常退出还是由于异常退出),都会调用上下文管理器的 __exit__() 方法,从而确保文件已正确关闭。 介绍 contextvars 模块contextvars 模块是 Python 的一个相对较新的补充(在 3.7 版本中引入),它提供了一种管理上下文本地状态的方法。上下文本地状态是与特定执行上下文相关联的状态,并且可供在该上下文内运行的所有代码使用。 让我们首先看一个简单的例子来理解 contextvars 模块的工作原理。假设我们有一个函数对全局变量执行某些操作 在此代码中,increment() 函数会增加一个名为 count 的全局变量,并打印其当前值。但是,此代码存在一个潜在问题:如果多个线程同时调用 increment() 函数,它们可能会相互干扰并导致竞态条件。 我们可以通过使用锁来解决此问题,以确保一次只有一个线程可以访问 count 变量。但是,这种方法可能很麻烦,并且还可能引入性能开销。或者,我们可以使用 contextvars 模块创建一个与每个线程的执行上下文相关联的上下文本地变量 在此代码中,我们已将全局 count 变量替换为使用 contextvars 模块的 ContextVar 类创建的上下文本地变量。ContextVar 类负责创建和管理上下文本地变量。 count 变量使用 default 参数初始化为默认值零。increment() 函数现在使用 count 变量的 set() 和 get() 方法来分别修改和检索其值。set() 方法为当前执行上下文设置上下文本地变量的值。相比之下,get() 方法检索当前执行上下文的变量值。 现在,如果我们从多个线程调用 increment() 函数,每个线程将拥有自己的 count 变量副本,该副本与自身的执行上下文相关联。这意味着我们不再需要担心竞态条件或同步问题。 在 Python 中使用上下文本地状态到目前为止,我们已经看到了 contextvars 模块如何在 Python 中创建和管理上下文本地状态。但是,我们如何在实际应用程序中使用此功能? 上下文本地状态的一个常见用例是管理数据库连接。 在许多应用程序中,通常有一个数据库连接池供多个线程或进程共享。但是,每个线程或进程都需要一个与自身执行上下文关联的连接对象。 使用 contextvars 模块,我们可以创建一个上下文本地变量,该变量为每个线程或进程保存一个数据库连接对象 在此代码中,我们使用 psycopg2 库创建了一个 PostgreSQL 连接池。handle_request() 函数针对每个传入的 HTTP 请求进行调用,并使用 get conn() 方法从池中检索连接。然后,使用 set() 方法将连接对象存储在名为 connection 的上下文本地变量中。 然后在请求处理代码中,我们可以使用 get() 方法检索连接对象 在此代码中,我们使用 get() 方法从上下文本地变量中检索了连接对象,并用它来执行 SQL 查询。由于 connection 变量与当前执行上下文相关联,因此我们不必担心其他线程或进程干扰我们的数据库连接。 结论contextvars 模块提供了一种在 Python 中管理上下文本地状态的强大方法。通过使用 ContextVar 类创建上下文本地变量,我们可以将状态与特定执行上下文相关联,并使其在同一上下文内的所有代码中可用。 本文展示了 contextvars 模块如何用于管理多线程 Python Web 应用程序中的数据库连接。但是,contextvars 模块还有许多其他潜在用途,例如管理用户会话、特定于请求的配置或事务状态。 总的来说,contextvars 模块是管理 Python 应用程序中状态的有用工具,对于从事多线程或多进程应用程序的开发人员来说,值得探索。 需要注意的是,contextvars 模块仅在 Python 3.7 及更高版本中可用,因此正在使用较旧版本 Python 的开发人员无法使用此模块。 此外,谨慎使用上下文本地状态很重要,因为过度使用可能会导致难以理解和维护的代码。通常,上下文本地状态应谨慎使用,并且仅在需要将状态与特定执行上下文关联时使用。 总的来说,contextvars 模块是管理 Python 中上下文本地状态的强大工具,并且可以解决多线程和多进程应用程序中的各种问题。通过使用上下文本地变量,开发人员可以避免竞态条件和同步问题,从而使他们的代码更加可靠且易于维护。 |
贪吃蛇是一款街机迷宫游戏,由 Gremlin Industries 公司创建,并于 1976 年 10 月由 Sega 发行。它被认为是一款优秀的游戏,并已在多代公众中广受欢迎。贪吃蛇游戏...
阅读 10 分钟
如何在 Python 中创建字典 在 Python 中,字典是无序的数据条目序列,可以像地图一样用于记录数据条目。与只将单个项作为对象的替代数据结构不同,...
阅读 4 分钟
在此教程中,我们根据广泛的书评展示了掌握 Python 的最佳书籍。每篇评论都提供了书籍的概述,包括所讨论的主题以及作者呈现这些概念的背景。基于格式和交付方式的...
11 分钟阅读
Pandas 是一个功能强大的 Python 库,为处理表格数据提供了易于使用的数据操作工具。它构建在 NumPy 包之上,并为数据分析提供了高级接口。数据分析中最常见的任务之一是读取...
7 分钟阅读
在本教程中,我们将学习如何使用 Python 脚本创建浅拷贝和深拷贝。通常,我们使用 =(赋值运算符)来创建 Python 对象的副本。让我们了解与在 Python 中创建副本相关的完整概念。拷贝在...
5 分钟阅读
什么是累积和?累积和的意思是“到目前为止的总和”。累积和的定义是给定序列的增加或随着更多加法而变大的总和。累积和的真实例子是不断增加的...
阅读 2 分钟
散点图是一种数据可视化方法,用于显示两个数值变量之间的关系。在 Python 中,有一个名为 DataFrame 的类,可以使用 pandas 绘制散点图,此类的成员称为 plot。通过使用...
阅读 6 分钟
简介:本文将教我们如何使用 Python 清理回收站。回收站是 Windows 系统上已删除文件和文件夹的临时存储位置。已删除的文档或文件夹被移动到回收站,如果...
阅读 4 分钟
? 全局解释器锁本教程将重点介绍 Python 的一个重要主题,GIL。我们还将通过代码实现来介绍 GIL 如何影响 Python 程序的性能。在深入探讨这个主题之前,让我们对 GIL 有一个基本的了解。GIL 或全局...
阅读 4 分钟
装饰器是 Python 中一个重要且有用的工具。它允许我们修改函数或类的行为。到目前为止,我们已经学习了如何使用函数创建装饰器,但在这里我们将讨论如何将类定义为装饰器。在...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India