Uvicorn:Python 异步 Web 服务器

Python 的 Web 开发长期依赖 WSGI 协议,但 WSGI 本质上是同步的,处理 WebSocket 或长连接时力不从心。Uvicorn 就是为了解决这个问题而生的。

正文顶部截图

Uvicorn 是一个基于 ASGI 协议的 Python Web 服务器,目前在 GitHub 上获得了超过 10,000 个 Star。

README区域截图

什么是 ASGI?

WSGI 定义的是一个同步的请求/响应模型,一个请求进来,处理完返回,整个过程是阻塞的。ASGI 在此基础上增加了对异步处理和 WebSocket 的支持。简单说,ASGI 让 Python 的 Web 框架能够同时处理大量并发连接,而不用为每个连接开一个线程。

安装

Uvicorn 通过 pip 安装:

pip install uvicorn

上面的命令只安装纯 Python 的依赖。如果想要更好的性能,可以安装带 Cython 依赖的版本:

pip install 'uvicorn[standard]'

standard 版本会额外安装 uvloop(事件循环)和 httptools(HTTP 协议处理),性能有明显提升。开发时的热重载功能、WebSocket 支持、彩色日志等也包含在这个版本里。

快速上手

创建一个 example.py

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

服务器就启动了。这里传入的是一个 ASGI callable,实际上 Uvicorn 可以直接运行 FastAPI、Starlette 等框架的应用,只需把模块路径传给它即可。

为什么选 Uvicorn?

Python 生态里有好几个 ASGI 服务器可选。Daphne 是最早的实现,由 Django Channels 团队维护,支持 HTTP/2。Hypercorn 支持 trio 异步框架。Granian 是 Rust 实现的,性能上限更高。

Uvicorn 的优势在于:社区活跃度高,和 FastAPI、Starlette 的集成最成熟,安装配置简单。大部分 Python 异步框架的文档里,推荐的默认服务器都是 Uvicorn。

开发模式

开发阶段用 --reload 参数可以监听文件变化自动重启:

uvicorn example:app --reload

生产环境可以配合 Gunicorn 使用,把 Uvicorn 作为 worker:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker example:app

这样既能利用 Gunicorn 的进程管理能力,又能享受 Uvicorn 的异步性能。

协议支持

Uvicorn 支持 HTTP/1.1 和 WebSocket。如果你需要 HTTP/2,可以考虑 Daphne 或者在 Uvicorn 前面放一个支持 HTTP/2 的反向代理(比如 Nginx)。

对于想要在 Python 里做异步 Web 开发的团队,Uvicorn 是当前最稳妥的选择。它轻量、配置简单、社区活跃,和主流异步框架的兼容性好。如果只是跑一个 API 服务或者 WebSocket 服务,pip install 一下就能用,没有额外负担。

。它轻量、配置简单、社区活跃,和主流异步框架的兼容性好。如果只是跑一个 API 服务或者 WebSocket 服务,pip install 一下就能用,没有额外负担。

Logo

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

更多推荐