Skip to content

一、什么是 Uvicorn ​

Uvicorn 是一个基于 uvloop 和 httptools 的高性能 Python ASGI 服务器,以其快速、轻量和异步特性著称。

┌─────────────────────────────────────────────────────────────────┐
│                         Uvicorn                                 │
├─────────────────────────────────────────────────────────────────┤
│  🌟 基于 uvloop(Node.js 事件循环的 Python 实现)               │
│  🌟 基于 httptools(高性能 HTTP 解析器)                         │
│  🌟 支持 ASGI(异步服务器网关接口)                              │
│  🌟 支持 WebSocket                                               │
│  🌟 支持 HTTP/2(通过 hypercorn)                                │
└─────────────────────────────────────────────────────────────────┘

二、核心特性 ​

特性说明
异步高性能基于 uvloop,比同步服务器快 2-4 倍
ASGI 规范兼容 Starlette、FastAPI、Quart 等 ASGI 框架
WebSocket原生支持 WebSocket 协议
热重载开发模式支持代码变更自动重载
低内存异步架构,内存占用低
日志系统内置访问日志和错误日志

三、Uvicorn 在项目中的使用 ​

3.1 项目入口 (app/main.py) ​

python
# 文件: app/main.py, 行 86-89
def run() -> None:
    import uvicorn
    
    uvicorn.run(
        "app.main:app",      # 应用入口: 模块名:应用变量名
        host=settings.app_host,   # 监听地址
        port=settings.app_port,   # 监听端口
        reload=True            # ⚠️ 开发模式热重载(生产应关闭)
    )

3.2 配置参数详解 ​

python
uvicorn.run(
    "app.main:app",           # ASGI 应用路径(字符串格式支持热重载)
    host="0.0.0.0",           # 监听地址
    port=8000,                # 监听端口
    reload=True,              # 自动重载(仅开发环境)
    workers=4,                # 工作进程数(仅 Unix,多进程模式)
    loop="uvloop",            # 事件循环实现
    limit_concurrency=1000,   # 最大并发连接数
    backlog=2048,             # 连接队列大小
    timeout_keep_alive=5,     # Keep-Alive 超时(秒)
    access_log=True,          # 访问日志
    use_colors=True,          # 彩色输出
)

四、Uvicorn 架构原理 ​

4.1 事件循环 (uvloop) ​

┌─────────────────────────────────────────────────────────────────┐
│                      Main Thread                                │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │                    Uvicorn Server                          │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐ │  │
│  │  │ HTTP Parser │→ │  Router     │→ │ ASGI Application    │ │  │
│  │  │ (httptools) │  │             │  │ (FastAPI/Starlette) │ │  │
│  │  └─────────────┘  └─────────────┘  └─────────────────────┘ │  │
│  └───────────────────────────────────────────────────────────┘  │
│                              ↓                                   │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │              uvloop Event Loop(异步事件循环)              │  │
│  │    ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐                │  │
│  │    │Task 1│  │Task 2│  │Task 3│  │Task N│   ...          │  │
│  │    └──────┘  └──────┘  └──────┘  └──────┘                │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

4.2 ASGI 协议流程 ​

请求进来
    │
    ▼
┌──────────────┐
│ Uvicorn      │  接收 HTTP 请求
│ (httptools)  │
└──────────────┘
    │
    ▼ ASGI Scope
┌──────────────┐
│ ASGI App     │  传递请求上下文(type, headers, path, ...)
│ (FastAPI)    │
└──────────────┘
    │
    ▼ ASGI Call
┌──────────────┐
│ Route/View   │  路由分发到具体处理函数
└──────────────┘
    │
    ▼ ASGI Response
┌──────────────┐
│ Uvicorn      │  发送 HTTP 响应
└──────────────┘
    │
    ▼
响应回去

五、命令行使用 ​

5.1 基本启动 ​

bash
# 方式 1: 直接指定应用
uvicorn app.main:app --host 0.0.0.0 --port 8000

# 方式 2: 从 Python 代码启动
python -c "import uvicorn; uvicorn.run('app.main:app', host='0.0.0.0', port=8000)"

# 方式 3: 使用 FastAPI 的方式(项目中采用)
python -m app.main

5.2 常用参数 ​

bash
uvicorn app.main:app \
    --host 0.0.0.0 \          # 监听地址
    --port 8000 \             # 端口
    --reload \                # 热重载(开发)
    --workers 4 \             # 工作进程(Unix)
    --loop uvloop \           # 事件循环
    --limit-concurrency 100 \ # 最大并发
    --access-log \            # 访问日志
    --log-level info \        # 日志级别
    --ssl-keyfile key.pem \   # HTTPS 密钥
    --ssl-certfile cert.pem   # HTTPS 证书

5.3 Gunicorn + Uvicorn(生产推荐) ​

bash
# 安装
pip install gunicorn

# 启动(多进程 + Uvicorn workers)
gunicorn app.main:app \
    -w 4 \                   # 4 个 worker 进程
    -k uvicorn.workers.UvicornWorker \  # Uvicorn worker 类型
    -b 0.0.0.0:8000

六、热重载原理 ​

python
# 项目中的热重载配置 (app/main.py 行 89)
uvicorn.run("app.main:app", host=settings.app_host, port=settings.app_port, reload=True)
启动时                    代码变更检测到
    │                            │
    ▼                            ▼
┌────────┐                 ┌─────────────┐
│ Watcher│ ───────────────▶│ Reload Loop │
│ 监控文件│                 │ 停止旧进程   │
└────────┘                 │ 启动新进程   │
                           └─────────────┘
                                  │
                                  ▼
                           ┌────────────┐
                           │ 新进程处理  │
                           │ 新请求      │
                           └────────────┘

注意:reload=True 会在检测到 .py 文件变化时自动重启服务,但会增加内存使用,生产环境应关闭。


七、性能对比 ​

服务器吞吐量(req/s)内存占用适用场景
Uvicorn~50,000低异步应用(FastAPI/Quart)
Gunicorn + Uvicorn~80,000中生产部署
Gunicorn + sync worker~30,000中同步 Django/Flask
waitress (sync)~10,000高轻量同步应用

八、与项目的关联 ​

┌─────────────────────────────────────────────────────────────────┐
│                     Ops Agent 架构                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   python -m app.main                                           │
│          │                                                      │
│          ▼                                                      │
│   uvicorn.run("app.main:app", ...)                             │
│          │                                                      │
│          ▼                                                      │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │  Uvicorn Server (uvloop 事件循环)                        │  │
│   │                                                          │  │
│   │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │  │
│   │  │ HTTP API │  │ SSE 流   │  │WebSocket │  │  静态文件 │ │  │
│   │  │ /auth/*  │  │/chat/... │  │/terminal │  │  /static │ │  │
│   │  └──────────┘  └──────────┘  └──────────┘  └──────────┘ │  │
│   │                                                          │  │
│   │  ┌────────────────────────────────────────────────────┐ │  │
│   │  │              FastAPI Application                    │ │  │
│   │  │  app = FastAPI(title="运维 Agent", version="0.1.0")│ │  │
│   │  └────────────────────────────────────────────────────┘ │  │
│   └─────────────────────────────────────────────────────────┘  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

九、总结 ​

项目内容
定义Python ASGI 高性能服务器
核心uvloop(事件循环)+ httptools(HTTP 解析)
优势异步高性能、热重载、低内存、WebSocket 支持
在项目中的作用承载 FastAPI 应用,处理所有 HTTP/WebSocket 请求
生产建议使用 gunicorn -k uvicorn.workers.UvicornWorker 多进程部署

Uvicorn 是现代 Python 异步 Web 服务的标准选择,尤其适合 FastAPI、Starlette 等 ASGI 框架构建的应用。

Released under the MIT License.