Uvicorn:Python 异步 Web 服务器的首选
Uvicorn:Python 异步 Web 服务器的首选
Python 做 Web 开发的人,大概率听过 Uvicorn。这个项目的 Star 数已经到 1 万以上,是 Python ASGI 生态里使用最广的服务器之一。
我自己最早接触 Uvicorn,是因为用 FastAPI。从 Flask 切过来后,启动命令从 python app.py 变成了 uvicorn app:app,顺手试了下,就再没换回去。之前用 WSGI 服务器的时候,遇到 WebSocket 或长连接场景总要绕很多弯路,换了 Uvicorn 之后,这些问题自然解决了。

解决了什么问题
Uvicorn 解决的核心问题,是 Python 异步 Web 服务器长期缺位。
Python 的 Web 服务器接口,最早是 WSGI 的天下。Django、Flask 这些框架都用它。WSGI 基于同步模型,设计简单直观:一个请求进来,处理完返回响应。对大部分传统 Web 应用来说够用了。
但近几年 Web 应用形态变了。实时聊天、在线协作、数据推送,这些场景都需要 WebSocket 或长轮询。WSGI 不支持这些协议。想实现推送功能,得额外搭一个服务,架构变得复杂。
ASGI 就是为解决这个问题而来的。它保留了 WSGI 的简单性,同时原生支持 WebSocket 和 HTTP/2。Uvicorn 是目前最主流的 ASGI 服务器实现,也是 FastAPI 和 Starlette 的默认搭档。
怎么用
安装就一行命令:
pip install uvicorn
如果对性能有要求,装标准版,会自动装 uvloop 和 httptools,事件循环和 HTTP 解析都用 C 语言实现,速度提升明显:
pip install uvicorn[standard]
写个最简单的应用:
async def app(scope, receive, send):
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!',
})
保存成 example.py,运行 uvicorn example:app,打开浏览器就能看到 Hello world。
实际项目里很少直接写 ASGI 应用,一般用 FastAPI 或 Starlette 框架来组织代码,Uvicorn 只负责运行。这种分层设计让开发和部署各司其职,清晰很多。

ASGI 生态里的位置
ASGI 协议的一个好处,是把服务器和框架解耦了。同样一套代码,用 Uvicorn、Daphne、Hypercorn 都能跑。Daphne 是 Django Channels 团队开发的,支持 HTTP/2。Hypercorn 支持 trio 异步框架。Mangum 让 ASGI 应用跑在 AWS Lambda 上。
Uvicorn 不是唯一的 ASGI 服务器,但它的生态整合最好。FastAPI、Starlette、Quart 这些框架默认都推荐 Uvicorn。社区里遇到问题,能找到的文档和讨论也最多。
如果你在用 Python 做异步 Web 开发,Uvicorn 是起步最顺的选择。从 pip install 到跑起来,只需要几分钟。
ython 做异步 Web 开发,Uvicorn 是起步最顺的选择。从 pip install 到跑起来,只需要几分钟。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)