await协程与await Task有何区别?FastAPI下redis两种异步查询写法差异
功能层面差异
- 两者完全没有功能差别,返回结果、异常处理逻辑完全一致
asyncio.ensure_future()的作用是把传入的协程包装成Task对象,提交到当前事件循环等待调度。但你在包装后立刻await这个Task,和直接await原始的redis.get(key)协程的执行逻辑是完全等价的:都会阻塞等待Redis查询完成后拿到返回值,查询过程中抛出的连接异常、超时异常等也会完全相同的向上抛出,不会有任何逻辑差异。
性能层面差异
- 两者性能差距极其微小,
get_2会有几乎可忽略的额外开销
get_2比get_1多了一步创建Task实例的操作,这个操作的资源消耗非常低,普通业务场景下根本感知不到二者的性能差异,只有在单进程每秒数万次以上的高频调用压测场景下,才会体现出可以测量到的微小性能差距。
额外优化建议
你给出的两个示例函数都存在一个更明显的性能问题:每次调用函数都会执行aioredis.from_url("redis://localhost")新建Redis连接,连接新建的开销远大于上面提到的Task创建开销,建议将Redis连接池实例全局初始化复用,不要每次请求都新建连接。
内容的提问来源于stack exchange,提问作者Rocherlee
相关产品推荐
相关产品推荐

