Uvicorn 服务器核心是 uvicorn/server.py,负责启动、监听与生命周期管理,协调 config、lifespan 和 protocols;调用 uvicorn.run() 后执行 startup→main_loop→shutdown;create_protocol 决定 HTTP/WS 解析器(httptools/h11/wsproto);protocols 目录实现字节流到 ASGI scope 的转换;loops 自动选择 uvloop 或 asyncio;middleware 顺序敏感,lifespan 必须正确 await 否则引发连接错误。

uvicorn/server.py 是整个服务器的控制中枢
启动、监听、生命周期管理都集中在这里。它不直接解析 HTTP 报文,也不处理业务逻辑,而是协调 config、lifespan、protocols 三者协作。你调用 uvicorn.run() 后,最终会实例化 Server 类并进入 startup() → main_loop() → shutdown() 流程。这个类里最值得盯住的是 create_protocol 工厂函数——它决定了用 httptools 还是 h11 解析请求,也决定了 WebSocket 是否启用 wsproto。
protocols 目录决定“字节流怎么变成 scope”
HTTP 和 WebSocket 的解析逻辑就藏在 uvicorn/protocols/ 下。两个关键实现:http.py(基于 httptools)和 h11.py(纯 Python)。默认走 httptools,性能高但调试困难;若想单步看请求头怎么被拆解,可强制设 http_protocol="h11"。注意:WebSocket 协议升级后,后续帧解析由 wsproto 完成,不是 httptools 管的——这点容易误以为“一个库全包”,实际是协议栈分层。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
loops 目录负责事件循环的自动兜底
uvicorn/loops/ 本质是个加载器:优先尝试 uvloop,失败则 fallback 到标准 asyncio。Windows 下默认只能用后者,所以压测时别在 Windows 上比吞吐——不是代码问题,是底层事件循环限制。你也可以显式指定 loop="uvloop",但得确保环境已安装 uvloop,否则启动直接报 ImportError: No module named 'uvloop'。
middleware 和 lifespan 是“非核心但常出问题”的模块
middleware 里的中间件按顺序嵌套:比如 ProxyHeadersMiddleware 必须在 MessageLoggerMiddleware 之前,否则日志里看到的 client_host 还是反向代理的 IP。而 lifespan 模块负责触发 startup/shutdown 事件,如果你的应用用了数据库连接池或 Redis 客户端,没正确 await lifespan.startup() 就开始收请求,大概率遇到 ConnectionRefusedError 或空指针。
server.py 会调用 protocols 创建连接处理器,但连接超时判断又部分依赖 config 里的 timeout_keep_alive 和 timeout_graceful_shutdown。改一个参数,可能同时影响协议层的 socket 关闭时机和生命周期管理的退出等待时间。

















