Uvicorn:Python 异步 Web 服务的标准答案
Uvicorn:Python 异步 Web 服务的标准答案
uvicorn 在 GitHub 上已经拿到 10,717 Star 了。
Uvicorn 是 Python 生态中的 ASGI Web 服务器,支持 HTTP/1.1 和 WebSocket。轻量、快速,几乎所有主流的 Python 异步框架都在用它做生产部署。
1、ASGI 解决了什么问题
Python Web 框架长期以来以 WSGI 为基石。WSGI 是一个同步调用的协议,接收请求、返回响应,简单直接。但它的局限性也很明显:不支持长连接,处理 WebSocket 或长轮询需要额外的中间层或协议切换。
ASGI 协议填补了这个空白。它把服务器和应用程序解耦,让异步框架可以共用一套工具链。Uvicorn 是这一协议目前使用最广泛的实现。

2、安装与使用
pip install uvicorn
安装后创建一个简单的 ASGI 应用:
async def app(scope, receive, send):
assert scope['type'] == 'http'
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
(b'content-type', b'text/plain'),
],
})
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})
运行:
uvicorn example:app
如果想获得更好的性能,可以安装带 Cython 扩展的版本:
pip install 'uvicorn[standard]'
标准版会自动引入 uvloop 替代默认事件循环,用 httptools 处理 HTTP 协议解析,WebSocket 协议交由 websockets 库接管。开发模式还自带文件监控重载、彩色日志、env 文件读取等特性。
3、性能从哪来
Uvicorn 本身用纯 Python 实现,核心逻辑简洁透明。性能提升主要来自 [standard] 可选项引入的两个 Cython 组件。
uvloop 是 asyncio 事件循环的直接替换,基于 libuv 实现,实测吞吐量比默认事件循环高出不少。httptools 是 HTTP 解析器,底层是 Node.js 同款的 http-parser C 库,解析效率比纯 Python 快一个数量级。
两者组合后,单机跑出几万 QPS 没有压力。

4、生态位与替代方案
ASGI 协议的魅力在于服务器和框架彼此独立。除了 Uvicorn,生态中还有其他选择。
Daphne 是第一个 ASGI 服务器,最初为 Django Channels 开发,在生产环境验证多年,支持 HTTP/1.1、HTTP/2 和 WebSocket。
Hypercorn 从 Quart 框架中独立出来,同样支持 HTTP/1.1、HTTP/2 和 WebSocket,还可以选择 trio 作为异步运行时。
Granian 是 Rust 实现的 ASGI 兼容服务器,支持 HTTP/2、TLS 和 WebSocket,在追求极致延迟的场景下值得关注。
Mangum 是一个适配器,让 ASGI 应用可以直接跑在 AWS Lambda 和 API Gateway 上。
Uvicorn 目前的优势不在于功能最多,而在于它在生态中的枢纽位置。FastAPI、Starlette 等主流框架的官方文档直接以 Uvicorn 作为默认部署方案,大部分 Python 异步应用已经在用它了。
5、谁适合用它
用 FastAPI、Starlette、Django Channels 等异步框架构建 Web 服务的开发者,Uvicorn 是生产部署的首选服务器。对高并发有要求时,uvloop 加 httptools 的组合能在单进程场景下提供足够可观的吞吐。需要 WebSocket 支持的应用也无需额外组件即可接手长连接。
Uvicorn 的定位很清晰:做好 ASGI 服务器这一件事。对于一个被 10,000 多个项目依赖的基础组件,稳健比花哨更重要。

浙公网安备 33010602011771号