当前位置: 首页 > 后端技术 > Python

pythonasyncio中上下文变量contextvar的简单测试

时间:2023-03-26 02:06:19 Python

介绍在asyncio中contextvar上下文作为全局变量使用,但是对于单个协程来说是局部变量。协程中处理上下文对其他协程没有影响。代码测试fromcontextvarsimportContextVar,copy_contextimportasyncioimportrandomcv=ContextVar('cv')asyncdefwaiting_func():awaitasyncio.sleep(random.random())print("valuesis-",cv.get(),id(cv))asyncdefcvset():print("incvset")a=cv.set(8)#print(a)print("***")t=asyncio.create_task(cvget("child"))awaittprint("***")asyncdefcvget(name):awaitasyncio.sleep(2)print(f"incvget-{name}")try:print(cv.get())except:print('geterror')asyncdefmain():asyncio.create_task(cvset())asyncio.create_task(cvget("main"))awaitasyncio.sleep(6)asyncio.run(main())输出如下:incvset***incvget-maingeterrorincvget-child8***detailedasyncdefmain():asyncio.create_task(cvset())asyncio.create_task(cvget("main"))awaitasyncio.sleep(6)启动两个协程。最初,不对全局变量cv执行set()操作。在一个协程中设置cv,另一个协程直接获取cv的值。asyncdefcvget(name):awaitasyncio.sleep(2)print(f"incvget-{name}")try:print(cv.get())除了:print('geterror')awaitasyncio.sleep(2)目的是让另一个协程先对cv进行set()操作。由于main()没有提前对全局变量cv进行set()操作。所以这个协程不存在。所以它会出错。asyncdefcvset():print("incvset")a=cv.set(8)#print(a)print("***")t=asyncio.create_task(cvget("child"))awaittprint("***")我们在这个协同程序中设置()cv。cv只对本协程及其子协程有效,所以可以在其子协程中获取cv数据。