背景
在高并发领域,Python因为全局解释器锁(GIL)的存在导致了在任何给定时间只有一个线程执行Python字节码,即使在多核处理器上也是如此。这意味着Python多线程程序无法充分利用多核处理器的优势。针对这个问题,python 的解决方案就是协程。
回到 web 这个方向来,也会有类似的问题,直到 FastAPI 的出现才真正的将 web 的异步发挥到了极致!所以在过去几年中,FastAPI 使用率持续走高,从 2021 年的 14% 快速上升到 2023 年的 25%
FastAPI 简介
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8+ 并基于标准的 Python 类型提示。
也就是说,要用 Python 3.8+ 才可以使用 FastAPI,另外其主要用来构建 API,特别适应现代前后端分离的场景。这一框架专注于高性能、高并发,利用了类型提示和内置异步支持等现代 Python 功能。专为使用 Python 构建 API 而设计,并且 FastAPI 还拥有强大的 API 文档,以及一系列额外功能和优势提升开发效率。
关键特性:
- 快速:可与 NodeJS 和 Go 并肩的极高性能。最快的 Python web 框架之一。
- 高效编码:提高功能开发速度约 200% 至 300%。
- 更少 bug:减少约 40% 的人为(开发者)导致错误。
- 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
- 简单:设计的易于使用和学习,阅读文档的时间更短。
- 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
- 健壮:生产可用级别的代码。还有自动生成的交互式文档。
- 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
FastAPI 环境安装
-
python 环境安装
根据要求至少需要 python 3.8及其以上,
可以去 python 官网 自行下载安装,这里我们用 python 3.11 -
FastAPI 环境安装
pip install fastapi
pip install "uvicorn[standard]"
其中 pip install “uvicorn[standard]” 用于安装ASGI服务器 uvicorn库及其标准依赖项。
- Python IDE
这里我们选择 PyCharm ,下载后安装即可。
没有专业版秘钥的可以下载 社区版本:PyCharm Community Edition
FastAPI 例子
首先我们先直观的感受一下,FastAPI 的使用
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}
if __name__ == '__main__':
import uvicorn
uvicorn.run("main:app",reload=True)
在 PyCharm 中执行上述代码后,可以在浏览器中分别访问
{"message":"Hello World"}
{"message":"Hello xiaoming"}
至此 FastAPI 的例子就大功告成了。在下一章,我们会详细描述一下 FastAPI 两大组件
扩展
FastAPI 和 ASGI服务器
FastAPI是一个基于Python的现代Web框架,它使用ASGI(Asynchronous Server Gateway Interface)服务器来运行。ASGI是一个异步的Python Web服务器接口规范,它定义了Web应用程序与服务器之间的通信协议。
FastAPI之所以需要ASGI服务器的支持,是因为它借助ASGI能够实现高性能和异步处理。ASGI服务器能够处理并发请求和非阻塞I/O操作,以提供更好的性能和可伸缩性。
FastAPI基于异步协程编程模型,使用async
和await
关键字来编写异步视图函数。ASGI服务器能够理解和运行这些异步函数,并与其他ASGI应用程序(如Starlette、uvicorn等)进行交互。ASGI服务器提供了事件循环和任务调度,能够同时处理多个请求,使得FastAPI能够高效地处理多个并发请求。
除此之外,ASGI服务器还支持WebSocket协议和其他一些高级功能,使得FastAPI能够轻松地处理实时通信和长连接等需求。
总之,FastAPI需要ASGI服务器支持,以便利用异步协程和高性能的特性,提供快速、可扩展的Web应用程序开发体验。ASGI服务器为FastAPI提供了并发处理、非阻塞I/O和其他高级功能的基础设施。
Uvicorn 命令
uvicorn.run(“main:app”,reload=True)
uvicorn main:app
命令含义如下:
main
:main.py
文件(一个 Python “模块”)。app
:在main.py
文件中通过app = FastAPI()
创建的对象。--reload
:让服务器在更新代码后重新启动。仅在开发时使用该选项。