1

Contextvar 'value' 在经历 'while' 循环时不会改变。

'''

import contextvars 
import keyboard
import asyncio
import random

value = contextvars.ContextVar('value')
value.set('-')


async def q():
    while True:

        await asyncio.sleep(1)
        print(value.get())


async def s():
    while True:
        x = random.choice(list(range(10)))
        value.set(x)
        await asyncio.sleep(1)



async def main():
    t1 = asyncio.create_task(q())
    t2 = asyncio.create_task(s())

    await t1



asyncio.run(main())

输出是 '---' 。我想为此上下文 var 设置一个新值,但我找不到任何类似的情况

第一次在这里所以我不知道是否所有图像都显示正确并且不知道在这里粘贴代码所以请帮忙

4

1 回答 1

0

contextvars 旨在完全隔离不同任务组的值。这个想法是,从您的任务中“等待”的任何调用都t2将看到在该任务中设置的值,并且t1从那里调用的任何调用都将“看到”在t1.

更具体地说,想想异步函数在 Web 框架中处理 http 请求的常见用法。框架可能会选择将有关每个请求的详细信息添加到 contextvars 中,这样它就不会麻烦将其作为参数传递给每个函数(http 标头、cookie 等)。- 但是每个函数都可以将这些作为“上下文”检索 - 并且这些值必须与在同一函数中看到的值隔离开来,但是当被调用以响应并行发生的另一个请求时。

如果您想跨多个任务和同步通信数据,请使用普通全局变量或队列 - https://docs.python.org/3/library/asyncio-queue.html - 如果您想管道值在其他任务/调用堆栈中使用。

于 2021-12-20T14:38:25.923 回答