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

更多推荐