使用uvicorn+uvloop部署FastAPI时,aioredis会用uvloop还是原生asyncio?
当FastAPI用uvicorn指定uvloop启动时,aioredis会使用uvloop事件循环吗?
答案是肯定的,aioredis会直接使用你通过uvicorn指定的uvloop事件循环,不需要额外做任何配置。
为什么会这样?因为在Python的asyncio生态里,事件循环是和当前运行上下文绑定的——当你用uvicorn main:app --workers 2 --loop uvloop启动服务时,uvicorn会把每个worker进程的默认事件循环替换成uvloop。而aioredis作为基于asyncio标准编写的库,它在创建客户端和执行异步操作时,会自动复用当前环境中活跃的事件循环。
看你提供的代码(这里补全了漏写的aioredis导入):
from fastapi import FastAPI import aioredis app = FastAPI() @app.get('/get/{key}') async def get_from_redis(key): redis = aioredis.from_url('redis://127.0.0.1') value = await redis.get(key) # 这里的异步操作完全跑在uvloop上 return {'response': value}
当请求进入/get/{key}接口时,整个异步函数的执行都是在uvicorn配置的uvloop事件循环里完成的,包括aioredis的Redis操作。
额外提一句:uvloop是asyncio事件循环的高性能替代实现,它完全兼容asyncio的API规范,所以所有基于asyncio的库(比如FastAPI、aioredis)都能无缝适配,不需要修改任何业务代码就能享受到uvloop带来的性能提升。
内容的提问来源于stack exchange,提问作者AndrePer
相关产品推荐
相关产品推荐

