118、asyncio 异步编程(四):uvloop、httpx、异步 Redis——生产级异步栈
118、asyncio 异步编程(四):uvloop、httpx、异步 Redis——生产级异步栈
从一次线上事故说起
凌晨两点,告警群炸了。用户反馈页面加载超过30秒,我登录服务器一看,CPU跑满,但内存还有富余。top里看到几十个 Python 进程在疯狂轮询,每个进程都在等 Redis 返回数据。更诡异的是,明明用了asyncio,但await之后的代码就像被卡住了一样,日志里连续几秒没有任何输出。
我第一反应是:事件循环被阻塞了。但检查代码,没有明显的同步阻塞调用。直到我注意到一个细节——我们用的 Redis 客户端是redis-py的同步版本,虽然外面包了一层run_in_executor,但连接池管理、序列化反序列化全在同步线程池里跑,线程池一满,整个事件循环就跟着瘫痪。
那次事故之后,我彻底重构了异步栈。今天聊的这三个组件——uvloop、httpx、async Redis——就是那次重构的核心收获。它们组合起来,能让你的异步程序从“看起来异步”变成“真正异步”。
uvloop:给事件循环换引擎
Python 原生的asyncio事件循环基于se