13.5 并发与并行处理
FastAPI入门教程:并发与并行处理
面向Python初学者的FastAPI入门教程,从零开始学习Web开发,通过动手实践快速上手。教程涵盖基础概念,并用生活化类比解释并发与并行处理,包含大量简单示例,助你建立信心。
FastAPI入门教程:学习并发与并行处理
欢迎来到Web开发世界!
如果你已经学过Python基础语法,但还没接触过Web开发,那么你来对地方了!FastAPI是一个现代、快速的Web框架,专门为Python设计。它的学习曲线平缓,特别适合初学者。今天,我们将一起动手创建一个简单的Web应用,并探索如何用它处理多个任务,这就是并发与并行处理。
生活化类比:想象一家餐厅。并发就像是多个服务员同时为不同桌子的顾客服务,而并行则像是多个厨师在后厨同时烹饪不同的菜肴。在Web开发中,你的应用可能需要同时处理多个用户的请求,FastAPI帮你轻松实现这一点。
第一步:设置环境
在开始之前,确保你已经安装了Python(建议3.7或更高版本)。然后,打开终端或命令行,运行以下命令来安装FastAPI和它的服务器工具:
pip install fastapi uvicorn
这就像是在你的工具箱里添加新工具。别担心,一次安装,终身受益!
第二步:你的第一个FastAPI应用
让我们创建一个简单的“Hello World”应用,体验第一个成功时刻!
- 打开你喜欢的代码编辑器(比如VS Code或记事本),创建一个新文件,命名为
main.py。 - 复制并粘贴以下代码:
from fastapi import FastAPI
app = FastAPI() # 创建一个FastAPI应用实例
@app.get("/") # 定义一个处理GET请求的路由,路径是根目录
async def read_root():
return {"message": "Hello, FastAPI World!"}
- 保存文件。
- 在终端中,导航到文件所在目录,运行:
uvicorn main:app --reload
你会在终端看到服务器启动的信息。打开浏览器,访问 http://127.0.0.1:8000,你会看到 {"message": "Hello, FastAPI World!"} 显示在页面上!
成功时刻:恭喜!你已经成功运行了第一个Web应用。这个应用可以响应GET请求,就像餐厅服务员对你说“欢迎光临”。
第三步:理解并发与并行
现在,让我们深入并发与并行处理的概念。在FastAPI中,这通过异步编程实现。别被术语吓到,我们用一个简单例子来解释。
并发:你的应用可以同时处理多个请求,即使代码在等待某个操作(比如从数据库读取数据),也能处理其他请求。
并行:你的代码同时执行多个任务,比如在多个CPU核心上运行。
FastAPI默认支持并发处理,因为它是异步的。让我们修改应用,演示这一点。
示例:并发处理请求
在 main.py 中添加一个新路由:
import asyncio # 导入异步库
@app.get("/slow")
async def slow_endpoint():
# 模拟一个慢操作,比如等待3秒
await asyncio.sleep(3) # 这会暂停当前函数,但允许其他请求继续处理
return {"message": "这个端点花了3秒响应,但其他请求不受影响!"}
保存文件,服务器会自动重启(因为有 --reload 参数)。现在,打开两个浏览器标签页:
- 一个访问
http://127.0.0.1:8000/,你会立刻看到消息。 - 另一个访问
http://127.0.0.1:8000/slow,它会等待3秒后响应。
尝试:在访问 /slow 的同时,打开另一个标签页访问 /。你会发现 / 依然快速响应,因为FastAPI在并发处理请求!
生活化类比:这就像是餐厅里,一个服务员在等厨房做菜(慢操作),但其他服务员可以继续服务新顾客。
示例:并行计算(可选)
并行通常涉及更复杂的CPU密集型任务。为了简单起见,我们展示一个概念性例子。在实际中,FastAPI可以结合多线程或多进程来并行处理。
import time
@app.get("/parallel")
def parallel_endpoint():
# 模拟一个CPU密集型任务
start_time = time.time()
result = sum(i * i for i in range(1000000)) # 计算平方和
elapsed_time = time.time() - start_time
return {"message": f"并行任务完成,耗时{elapsed_time:.2f}秒!", "result": result}
访问 http://127.0.0.1:8000/parallel,看看它如何工作。注意:这个例子是同步的,但在真实应用中,你可以用异步库如 asyncio 或外部工具来优化并行。
第四步:更多简单示例,巩固信心
让我们添加几个有趣的路由,让你体验更多成功时刻!
示例:动态路由
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id, "description": f"这是物品{item_id}的信息"}
访问 http://127.0.0.1:8000/items/42,你会看到自定义响应。
示例:查询参数
@app.get("/users/")
async def read_user(name: str = "Guest", age: int = 0):
return {"user_name": name, "age": age, "greeting": f"你好,{name}!"}
访问 http://127.0.0.1:8000/users/?name=Alice&age=30,玩转URL参数。
总结和下一步
你已经学会了:
- 如何安装和运行FastAPI。
- 创建基本应用和处理GET请求。
- 理解并发与并行处理的概念,并通过示例看到FastAPI的并发能力。
保持信心:Web开发可能看起来复杂,但FastAPI让它变得简单。每次运行代码并看到结果,都是一次成功!
建议下一步:
- 探索FastAPI官方文档(https://fastapi.tiangolo.com/),那里有更多详细指南。
- 尝试添加POST请求、数据库连接或更高级的异步任务。
- 记住,实践是学习的关键——多写代码,多测试。
现在,你已经迈出了Web开发的第一步。继续动手,享受编码的乐趣!