{site_name}

{site_name}

🌜 搜索

Python 中的 contextvars(上下文变量)是一种新的标准库,在 P

Python 𝄐 0
python中context,python文字变量,python规定变量以字母或下划线开头,python中context对象,python中上下左右的代码,python上下对齐
Python 中的 contextvars(上下文变量)是一种新的标准库,在 Python 3.7 版本中引入,用于管理在应用程序中共享的上下文信息。这些上下文信息可以在进程、线程和协程之间随时传递,并且是基于协程而不是基于线程的。

contextvars 的主要作用是提供了一个线程安全的方法来管理共享数据,不需要使用锁或全局变量。每个协程都有自己的上下文,并且可以访问其自己的上下文以及其他协程的上下文,因此可以有效地避免并发问题。

下面是一个简单的例子,演示了如何在协程之间共享上下文变量:

python
import asyncio
import contextvars

# 创建一个上下文变量
name = contextvars.ContextVar("name", default="")

async def greet():
# 在当前协程中设置上下文变量的值
name.set("Alice")
print(f"Hello, {name.get()}!")

async def greet_again():
# 在另一个协程中获取上下文变量的值
print(f"Welcome back, {name.get()}!")

async def main():
# 创建两个协程
task1 = asyncio.create_task(greet())
task2 = asyncio.create_task(greet_again())
await asyncio.gather(task1, task2)

# 运行主函数
asyncio.run(main())

# 输出:
# Hello, Alice!
# Welcome back, Alice!


在上面的代码中,我们使用 contextvars.ContextVar 创建了一个名为 name 的上下文变量,并将其默认值设置为空字符串。然后,在 greet 协程中,我们使用 name.set() 方法将上下文变量的值设置为 "Alice",并在 greet_again 协程中使用 name.get() 方法获取该值。由于这两个协程共享上下文变量 name,因此它们都可以访问和修改它的值。当运行程序时,我们得到了以下输出:


Hello, Alice!
Welcome back, Alice!


这表明两个协程都能够正确地读取和修改上下文变量 name 的值,而不会相互干扰或受到其他协程的影响。