简介

在 asyncio中,contextvar上下文作为全局变量,然而对于单个协程来说就是一个局部变量。在一个协程中对context做解决,对其余协程来说没有影响.

代码测试

from contextvars import ContextVar,copy_contextimport asyncioimport randomcv = ContextVar('cv')async def waiting_func():    await asyncio.sleep(random.random())    print("the values is - ",cv.get(),id(cv))async def cvset():    print("in cv set")    a=cv.set(8)    # print(a)    print("***")    t = asyncio.create_task(cvget("child"))    await t    print("***")async def cvget(name):    await asyncio.sleep(2)    print(f"in cv get - {name}")    try:        print(cv.get())    except:        print(' get error ')async def main():    asyncio.create_task(cvset())    asyncio.create_task(cvget("main"))    await asyncio.sleep(6)asyncio.run(main())

输入如下:

in cv set***in cv get - main get errorin cv get - child8***

详解

async def main():    asyncio.create_task(cvset())    asyncio.create_task(cvget("main"))    await asyncio.sleep(6)

启动两个协程。初始时并没有对全局变量cv进行set()操作。在一个协程外部设置cv,另一个协程间接获取cv的值。

async def cvget(name):    await asyncio.sleep(2)    print(f"in cv get - {name}")    try:        print(cv.get())    except:        print(' get error ')

await asyncio.sleep(2)目标是先让另一个协程对cv进行set()操作。因为main()中当时并没有对全局变量cv进行set()操作。所以对此协程来说是不存在的。所以会出错。

async def cvset():    print("in cv set")    a=cv.set(8)    # print(a)    print("***")    t = asyncio.create_task(cvget("child"))    await t    print("***")

咱们在此协程中对cv进行set()操作。cv只对此协程以及其子协程无效,所以在其子协程中能够取得cv的数据。