跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonNode.jsAI

Python ASGI 服务器 uvicorn 极简实战指南

Python ASGI 服务器 uvicorn 是运行 FastAPI 等应用的首选。本文涵盖安装(标准版含 uvloop)、基础用法(命令行与代码启动)、常用参数(reload、workers)及生产环境部署(配合 Gunicorn)。同时深入解析 uvloop 原理,解释其如何通过 libuv 和 Cython 提升 asyncio 性能至 2-4 倍,并提供跨线程唤醒、定时器映射等底层机制说明,帮助开发者快速上手并优化高并发场景下的 Python 服务性能。

利刃发布于 2026/3/30更新于 2026/10/2187 浏览
Python ASGI 服务器 uvicorn 极简实战指南

Python ASGI 服务器 uvicorn 极简实战指南

Uvicorn 是一个基于 uvloop 和 httptools 构建的超快 ASGI Web 服务器,通常用于运行 FastAPI 或 Starlette 应用。它支持 HTTP/1.1 和 WebSocket,是 Python 异步生态中的核心组件。

安装建议

为了获得最佳性能,建议安装标准版(包含 Cython 依赖):

pip install "uvicorn[standard]"

最小安装仅包含基础依赖(h11 + click),但缺少 uvloop 等加速库。

编写最简单的应用

创建一个名为 main.py 的文件,你可以选择两种场景:

场景 A:配合 FastAPI(最常用)

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

场景 B:原生 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, Uvicorn!',
    })

启动服务器

命令行方式

在终端中直接运行,这是开发阶段最常用的方式:

uvicorn main:app --reload
  • main: 你的 Python 文件名(不含 .py)。
  • app: 文件中实例化的对象名(例如 app = FastAPI())。
  • --reload: 开发模式神器。代码修改后自动重启服务器,无需手动停止进程。

脚本方式

如果你希望直接在 Python 文件中启动服务(方便调试):

# main.py 文件底部
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return "OK"

if __name__ == "__main__":
    # 等同于命令行:uvicorn main:app --reload
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)

运行方法:python main.py

常用参数速查

这些参数基本能覆盖 80% 的场景:

参数说明示例
--reload开发模式,代码变动自动重启uvicorn main:app --reload
--host绑定 IP。0.0.0.0 允许外网访问uvicorn main:app --host 0.0.0.0
--port指定端口(默认 8000)uvicorn main:app --port 8080
--workers启动的工作进程数(生产环境用)uvicorn main:app --workers 4

注意: --workers 和 --reload 互斥,不能同时使用。

生产环境部署建议

在生产环境中(Linux),通常不直接裸跑 Uvicorn,而是使用 Gunicorn 作为进程管理器来管理 Uvicorn 的 Worker,以获得更好的稳定性和性能。

安装 Gunicorn:

pip install gunicorn

运行命令:

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
  • -w 4: 开启 4 个 Worker 进程。
  • -k ...: 指定使用 Uvicorn 的 Worker 类。

进阶:uvloop 原理与优化

什么是 uvloop?

一句话介绍:它是 Python 标准库 asyncio 的高性能替代品。

  • 核心: 基于 libuv(Node.js 也在用这个库)构建。
  • 效果: 让 Python 的异步代码运行速度提高 2-4 倍,性能直逼 Go 和 Node.js。
  • 适用: Linux 和 macOS(不支持 Windows)。

如何使用

使用非常简单,只需要添加两行代码:引入库,然后调用 install()。

import asyncio
import uvloop

async def main():
    print("Hello, uvloop!")
    await asyncio.sleep(1)
    print("Done.")

if __name__ == "__main__":
    # 安装 uvloop 策略
    # 这行代码会将 asyncio 的默认事件循环替换为 uvloop
    uvloop.install()
    asyncio.run(main())

Web 框架中使用: 如果你是做 Web 开发(FastAPI, Sanic, Django 等),通常不需要手动写代码。

  • Sanic: 默认内置并使用 uvloop。
  • Uvicorn (FastAPI 的默认服务器): Uvicorn 默认就会检测并使用 uvloop。只要你安装了它,Uvicorn 就会自动启用。
# 只要安装了 uvloop,启动时不需要额外配置
pip install uvloop
uvicorn main:app

如果想强制使用或禁用: uvicorn main:app --loop uvloop 或 --loop asyncio。

为什么 uvloop 更快?

uvloop 之所以快,并不是因为它使用了什么魔法,而是因为它通过 Cython 将 Python 标准库 asyncio 的核心逻辑(事件循环)用 C 语言 重新写了一遍,底层则由高性能的 libuv 驱动。

可以将它的原理拆解为三个核心支柱:

1. 核心引擎:libuv

libuv 是 Node.js 的核心异步 I/O 库。它在 Linux 上使用 epoll,在 macOS 上使用 kqueue,这些是操作系统能够提供的最高效的 I/O 通知机制。

2. 桥梁技术:Cython

uvloop 是用 Cython 编写的扩展模块。它完全替换了 asyncio.AbstractEventLoop 接口的实现,绕过了 Python 解释器的部分开销。整个事件循环的'心跳'是在 C 语言层面运行的。

3. 性能优化的细节
  • 零损耗的内存管理: 使用 Free list 技术重用内存,减少 GC 压力。
  • 函数调用开销最小化: 内部处理尽可能保持在 C 层面流转。
  • 高效的句柄管理: 针对不同类型的 I/O 进行了专门的优化路径。

常见坑点

  1. 操作系统限制: uvloop 不支持 Windows。如果在 Windows 上开发,请使用标准 asyncio,部署到 Linux 服务器时再安装 uvloop。
  2. 设置时机: 要在创建事件循环之前设置好(如程序入口最早发生)。
  3. Jupyter 环境: 在 Notebook 中已有 Event Loop 运行时,直接 uvloop.install() 可能会报错,通常建议在生产代码中加上兼容处理。
try:
    import uvloop
    uvloop.install()
except ImportError:
    pass  # Windows 下没有 uvloop,回退到标准 asyncio

总结

开发用 uvicorn main:app --reload,生产用 Gunicorn 带 Uvicorn Worker。对于高并发网络 I/O 场景,确保安装 uvloop 能让服务性能提升一个台阶。

目录

  1. Python ASGI 服务器 uvicorn 极简实战指南
  2. 安装建议
  3. 编写最简单的应用
  4. 场景 A:配合 FastAPI(最常用)
  5. 场景 B:原生 ASGI 应用(不依赖框架)
  6. 启动服务器
  7. 命令行方式
  8. 脚本方式
  9. main.py 文件底部
  10. 常用参数速查
  11. 生产环境部署建议
  12. 进阶:uvloop 原理与优化
  13. 什么是 uvloop?
  14. 如何使用
  15. 只要安装了 uvloop,启动时不需要额外配置
  16. 为什么 uvloop 更快?
  17. 1. 核心引擎:libuv
  18. 2. 桥梁技术:Cython
  19. 3. 性能优化的细节
  20. 常见坑点
  21. 总结

更多推荐文章

查看全部
  • MySQL 主从集群原理与 Docker 实战部署
  • RabbitMQ/Spring-AMQP 高级特性:事务机制与消息限流实战
  • 大语言模型 LoRA 微调实战指南
  • AIGC 爆款视频《牌子》创作方法论与逐帧分析
  • Django 壁纸管理系统的设计与实现
  • Java JDK 23 本地环境搭建与配置详解
  • 基于深度迁移学习的医疗信息分类:层次化编码器方案
  • Adobe 联合伯克利研发 AI 工具识别面部修图
  • 大模型基本技术:架构、训练与推理优化详解
  • RAG 及数据增强型 LLM 应用的 4 个任务级别划分与应对策略
  • C++ 面向对象:多态的概念与实现原理
  • 前端大数据导出优化:解决 Chrome 内存崩溃的实战方案
  • HTML5 Web Workers 详解:提升网页性能与响应速度的关键
  • 强化学习与大模型融合:从理论到机器人实践全解析
  • C++ 多线程同步:条件变量 condition_variable 实战
  • Python Flask 多文件项目打包部署:Linux+Docker+Windows 全环境
  • C++ 伸展树与红黑树原理及代码实现
  • 普通笔记本跑 Faster-Whisper:CPU 模式下模型选择指南
  • Midjourney 官网地址查询与中文支持说明
  • OpenClaw 上手:环境、模型与飞书集成全流程

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online