关于python:上下文变量-contextvar-在-python-asyncio-中的简单测试

8次阅读

共计 1196 个字符,预计需要花费 3 分钟才能阅读完成。

简介

在 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 的数据。

正文完
 0