同步multi_get比asyncio.gather实现的异步get快很多是否合理?
这种情况完全合理
核心原因分析:
- 网络请求量级差异:同步
get_multi是单次批量请求,只需要一次网络往返就能获取所有key;而你的异步代码里,每个key都要执行exists+get两次异步调用,N个key就会产生2N次独立的网络请求。哪怕是异步并发,大量请求的往返延迟累积,尤其是P99这类长尾延迟,会被个别慢请求显著放大。 - 异步调度的额外开销:每个key都要创建
asyncio.Task,加上多次异步IO的调度切换,这些额外的调度成本在key数量多的时候会被快速累积,进一步拉高整体延迟。 - 服务端处理效率:缓存服务(比如你用的Couchbase)对批量请求的优化远优于处理大量单key请求——服务端可以一次性批量查询,减少内部线程调度、锁竞争等开销,响应速度自然更快。
异步代码优化建议
如果想让异步版本性能追上同步批量,直接改用异步的批量获取接口,替代单个key的异步请求叠加。修改后的代码大概是这样:
async def main_async(cls, keys): cb = await cls.get_cb_conn_async() results = await cb.get_multi(keys, quiet=True) val_dicts = [] for k in keys: if results.get(k): val_dicts.append({k: cls.cache_to_dict(results.get(k).value)}) else: val_dicts.append({k: {}}) return val_dicts
这样只需要一次异步批量请求,就能大幅降低延迟,接近同步版本的性能。
内容的提问来源于stack exchange,提问作者Rashad Eletreby
相关产品推荐
相关产品推荐

