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 没有压力。

README区域截图

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 多个项目依赖的基础组件,稳健比花哨更重要。

posted @ 2026-06-10 16:20  cloudnine36  阅读(9)  评论(0)    收藏  举报