Skip to content

FastAPI

笔记:

非阻塞的核心:事件循环(event loop)

async 是语法 协程函数。async/await = 语法糖,告诉 Python 哪些地方可以挂起/恢复。 asyncio 是 Python 标准库,提供了 事件循环、任务调度、协程运行环境。asyncio = 调度引擎,真正运行和管理这些协程。

在 Python 的 asyncio 里,调度器就是事件循环(event loop)。

fastapi 只是 ASGI 应用。没有内置 HTTP 服务器。所以必须找个 ASGI 服务器 来跑它。 FastAPI 专注“业务逻辑”,Uvicorn 专注“网络通信”。

Flask 是 WSGI 应用。 WSGI 和 ASGI 的区别

uvicorn main:app --reload

Python 的线程限制 —— GIL。同一时间只允许一个线程执行 Python 字节码。导致 CPU 密集型任务 → 多线程也只能“排队”执行,不能真正利用多核。IO 密集型任务 → 多线程能利用线程切换空闲时间,效果好一些,但还是比异步略慢。

因此你 fastapi 需要通过 worker 参数启动多个进程来处理 http 请求,而不是通过线程扩展

AI 总结:

在 Python 异步编程中,非阻塞的核心是事件循环(event loop)async 是 Python 的语法,用来定义协程函数;await 则标记可以挂起和恢复的点。也就是说,async/await 本质上是语法糖,用来告诉 Python 哪些地方可以暂停执行以等待其他操作完成。真正管理协程运行的是 asyncio,它是 Python 的标准库,提供事件循环、任务调度和协程运行环境。可以把 asyncio 看作调度引擎,而事件循环就是这个调度器本身。

在 Web 框架层面,FastAPI 是一个 ASGI 应用,它专注于业务逻辑本身,但不自带 HTTP 服务器,因此需要借助 Uvicorn 这样的 ASGI 服务器来处理网络通信。换句话说,FastAPI 只负责“干活”,Uvicorn 负责“接电话”。启动一个 FastAPI 应用的典型命令是:

bash
uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8001

这里,main:app 指向你的 FastAPI 实例,--reload 用于开发模式下的热重载。默认情况下,Uvicorn 会使用单个进程监听端口 8000。

Python 的线程模型受限于 GIL(全局解释器锁),同一时间只允许一个线程执行 Python 字节码。这意味着 CPU 密集型任务在多线程下无法真正并行,只会排队执行;而 IO 密集型任务可以利用线程切换空闲时间,但效率仍比异步略低。因此,在处理高并发 HTTP 请求时,使用线程扩展并不理想。FastAPI 通过多进程方式(即 Uvicorn 的 --workers 参数)启动多个进程来并行处理请求,而不是依赖线程。

最后,FastAPI 是 ASGI 应用,而传统的 Flask 是 WSGI 应用。两者的根本区别在于并发模型:WSGI 基于同步请求/响应,而 ASGI 支持异步、非阻塞和事件驱动,可以更高效地处理 IO 密集型任务和高并发场景。