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 只负责运行。这种分层设计让开发和部署各司其职,清晰很多。

README区域截图

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 到跑起来,只需要几分钟。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐