简介
在 asyncio中,contextvar上下文作为全局变量,但是对于单个协程来说就是一个局部变量。在一个协程中对context做处理,对其他协程来说没有影响.
代码测试
from contextvars import ContextVar,copy_context
import asyncio
import random
cv = 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 error
in cv get - child
8
***
详解
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的数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。