uvicorn/fastapi/flash/asyncio区别

uvicorn/fastapi/flash/asyncio区别

项目 类型 作用 与 asyncio 的关系
asyncio Python标准库 提供异步编程基础 基础异步运行时
Uvicorn ASGI服务器 运行异步Web应用 基于 asyncio 构建
FastAPI Web框架 构建Web API 内部使用 asyncio 处理异步请求
Flask Web框架 构建Web应用 传统同步,可搭配异步但非原生

关键区别:

  • asyncio 是底层异步引擎

  • Uvicorn 是利用 asyncio 的服务器

  • FastAPI 是基于 asyncio 的异步框架

  • Flask 是同步框架,需要额外适配才能用 asyncio

关系层级

关系层级:

1
客户端请求 → Uvicorn(服务器) → FastAPI/Flask(Web框架) → 你的代码
  • Flask:同步WSGI框架,通常使用 Gunicorn + Werkzeug 作为服务器

  • FastAPI:异步ASGI框架,通常使用 Uvicorn 作为服务器

  • Uvicorn服务器,负责处理网络连接、协议解析等底层工作

  • FastAPI/FlaskWeb框架,负责路由、请求处理、响应生成等应用逻辑

Uvicorn使用

Uvicorn 是一个ASGI(Asynchronous Server Gateway Interface)服务器,专门用于运行异步Python Web应用。它基于uvloophttptools构建,性能非常高。

主要特点:

  • 支持 HTTP/1.1 和 WebSockets

  • 支持 ASGI 应用

  • 高性能,基于异步I/O

  • 常用于部署 FastAPI、Starlette 等异步框架

简单的 FastAPI + Uvicorn 使用例子

安装依赖: pip install fastapi uvicorn

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from fastapi import FastAPI
import asyncio
from datetime import datetime

# 创建 FastAPI 应用实例
app = FastAPI(title="示例API")

# 同步路由(传统方式)
@app.get("/")
def read_root():
    return {"message": "Hello World", "timestamp": datetime.now().isoformat()}

# 异步路由(推荐在 FastAPI 中使用)
@app.get("/async")
async def read_async():
    # 模拟异步操作,如数据库查询、API调用等
    await asyncio.sleep(1)  # 非阻塞等待
    return {
        "message": "Async Hello World",
        "timestamp": datetime.now().isoformat()
    }

# 带路径参数的路由
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {
        "item_id": item_id,
        "query_param": q,
        "is_even": item_id % 2 == 0
    }

# 启动参数配置
if __name__ == "__main__":
    import uvicorn

    # 使用 uvicorn 直接运行
    # 参数说明:
    # - app: FastAPI 应用实例
    # - host: 监听地址
    # - port: 监听端口
    # - reload: 开发时自动重载
    uvicorn.run(
        app="main:app",  # 模块名:应用实例名
        host="0.0.0.0",
        port=8000,
        reload=True,  # 仅开发环境使用
        log_level="info"
    )

启动方式1: 直接运行 Python 文件 python main.py

启动方式2: 使用 Uvicorn 命令行

1
2
3
4
5
6
7
8
# 基本运行
uvicorn main:app --host 0.0.0.0 --port 8000

# 带热重载(开发环境)
uvicorn main:app --reload

# 增加并发工作进程(生产环境)
uvicorn main:app --workers 4

启动后,可以访问:

  1. 根路径: http://localhost:8000/

  2. 异步端点: http://localhost:8000/async

  3. 带参数路径: http://localhost:8000/items/42?q=test

  4. 自动文档:

生产环境部署

对于生产环境,建议:

1
2
3
4
5
6
# 使用多个 worker 进程
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

# 或者使用 Gunicorn 作为进程管理器(搭配 Uvicorn worker)
pip install gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000