from fastapi import FastAPI
import asyncio
app = FastAPI()
async def task_one(id: int):
# 模拟耗时操作,例如数据库查询
await asyncio.sleep(1)
return {"message": f"任务一完成,ID: {id}"}
async def task_two(id: int):
# 模拟耗时操作,例如调用外部 API
await asyncio.sleep(2)
return {"message": f"任务二完成,ID: {id}"}
@app.get("/run_tasks/{task_id}")
async def run_tasks(task_id: int):
# 并发运行 task_one 和 task_two
results = await asyncio.gather(
task_one(task_id),
task_two(task_id)
)
# 将结果合并成一个字典
return {
"task_one": results[0],
"task_two": results[1]
}
解释:
- 导入库: 首先,我们导入了
fastapi
和asyncio
库。 - 创建 FastAPI 应用: 我们创建了一个 FastAPI 应用实例。
- 定义异步函数: 我们定义了两个异步函数
task_one
和task_two
,它们模拟了一些耗时的异步操作,并接受一个task_id
参数。 - 创建路由处理函数: 我们创建了一个 GET 路由
/run_tasks/{task_id}
,它接受一个路径参数task_id
。 - 使用
asyncio.gather
并发执行任务: 在路由处理函数中,我们使用asyncio.gather
并发运行task_one
和task_two
,并将task_id
传递给它们。 - 合并结果并返回:
asyncio.gather
返回一个包含所有任务结果的列表,我们将其合并成一个字典并返回给客户端。
现在,您可以运行 FastAPI 应用,并访问 /run_tasks/1
类似的地址来触发并发任务执行。例如,访问 /run_tasks/1
2秒后将返回:
{
"task_one": {"message": "任务一完成,ID: 1"},
"task_two": {"message": "任务二完成,ID: 1"}
}
希望这个例子能帮助您理解如何在 FastAPI 中使用 asyncio.gather
并发运行多个异步函数。