环境进行控制。由 PEP 492
引入。
示例:
import asyncio
class AsyncContextManager(object):
def __init__(self):
self.conn = conn
async def do_something(self):
# 异步操作数据库
return 666
async def __aenter__(self):
# 异步连接数据库
self.conn = await asyncio.sleep(1) # 可以换成连接数据库代码
return self
async def __aexit__(self, exc_type, exc, tb):
# 异步关闭数据库链接
await asyncio.sleep(1)
# 以下代码会报错,因为 async with 必须写在协程函数内。
# obj = AsyncContextManager()
# async with obj:
# result = await obj.do_something()
# print(result)
# 或者
# async with AsyncContextManager() as f:
# result = await f.do_something()
# print(result)
async def func():
async with AsyncContextManager() as f:
result = await f.do_something()
print(result)
asyncio.run(func())
4. uvloop
uvloop
是 asyncio
事件循环的替代方案,可以提高事件循环效率,性能接近于 go
语言。
pip3 install uvloop
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
# Your asyncio code here.
# 内部的事件循环自动会变为 uvloop
asyncio.run()
注意:asgi
是支持异步的 wsgi
网关接口(e.g. uvicorn
,内部使用的就是 uvloop
)。