上下文

予早 2025-02-21 01:08:21
Categories: Tags:

https://docs.python.org/zh-cn/3/library/asyncio-task.html#asyncio.Task.get_context

https://docs.python.org/zh-cn/3/library/asyncio.html

current context,当前上下文

在当前被 ContextVar 对象用来访问 (获取或设置) 上下文变量 的值的 context (contextvars.Context 对象)。 每个线程都具有它自己的当前上下文。 用于执行异步任务 (参见 asyncio) 的框架会在每个任务开始或恢复执行时将任务关联到一个成为当前上下文的上下文。

获取当前上下文的值

import asyncio
import contextvars

# 定义一个上下文变量
my_context_var = contextvars.ContextVar('my_context_var', default='default_value')

async def main():
    # 设置上下文变量的值
    my_context_var.set('current_value')

    # 获取当前事件循环
    loop = asyncio.get_running_loop()
    print(f"当前事件循环: {loop}")

    # 获取当前任务
    current_task = asyncio.current_task()
    print(f"当前任务: {current_task}")

    # 获取任务的上下文变量值
    context_value = my_context_var.get()
    print(f"当前任务的上下文变量值: {context_value}")

    # 获取当前上下文所有变量值
    print(current_task.get_context().items())

asyncio.run(main())
import contextvars

# 定义一个上下文变量
var: contextvars.ContextVar = contextvars.ContextVar('var', default='default_value')

# 定义一个可变对象,例如列表
mutable_object = [1, 2, 3]
var.set(mutable_object)

# 获取当前上下文的拷贝
copied_context = contextvars.copy_context()

# 在原始上下文中修改列表的内容
mutable_object.append(4)  # 修改原始对象

# 在新上下文中获取上下文变量的值
copied_value = copied_context[var]


# 打印原始上下文和新上下文中的值
print("原始上下文中的值:", var.get())  # 输出 [1, 2, 3, 4]
print("新上下文中的值:", copied_value)  # 输出 [1, 2, 3, 4]

# 证明它们是同一个对象
print("它们是同一个对象吗?", copied_value is var.get())  # 输出 True

for k, v in copied_context.items():
    print(k.name, v)