开发响应迅速且高效的Web应用程序是开发者的首要目标之一。一个常见的需求是,当触发一个端点时能够并行执行多个任务,但在第一个任务完成后立即返回响应,同时其余任务继续在后台运行。
挑战
假设在触发一个端点时,你有三个耗时任务需要运行,但你希望在第一个任务完成后立即提供响应,而剩下的任务继续在后台运行。
使用FastAPI和asyncio
FastAPI结合Python的asyncio
库,提供了一种强大的方法来应对这种需求。下面是一个简单而有效的方法来解决这个问题。
代码
python
from fastapi import FastAPI
import asyncio
app = FastAPI()
async def first_sub_function():
# 模拟第一个函数的延迟
await asyncio.sleep(1)
return "第一个结果"
async def second_sub_function():
# 模拟第二个函数的延迟
await asyncio.sleep(5)
print("第二个任务完成")
return "第二个结果"
async def third_sub_function():
# 模拟第三个函数的延迟
await asyncio.sleep(3)
print("第三个任务完成")
return "第三个结果"
@app.post("/run-tasks")
async def run_tasks():
# 创建第一个子函数的协程
first_task = first_sub_function()
# 将第二和第三个子函数作为后台任务启动
second_task = asyncio.create_task(second_sub_function())
third_task = asyncio.create_task(third_sub_function())
# 等待第一个任务完成
first_result = await first_task
# 仅返回第一个任务的结果
return {"result": first_result}
工作原理
-
定义异步函数 :我们定义了三个异步函数,每个函数通过使用
await asyncio.sleep()
来模拟延迟任务。 -
创建FastAPI应用 :我们初始化了一个FastAPI应用实例,
app
。 -
设计端点 :
/run-tasks
端点触发我们定义的任务执行。 -
执行和等待任务:
-
第一个任务(
first_sub_function()
)直接等待(await),这意味着端点会等待其完成。 -
其他两个任务(
second_sub_function()
和third_sub_function()
)通过asyncio.create_task()
启动为后台任务。
-
-
即时响应:端点在第一个任务结果可用时立即返回,而其余任务继续在后台运行。
运行应用程序
要运行FastAPI应用程序,将代码保存为文件(例如main.py
),然后运行以下命令:
bash
uvicorn main:app --reload
结论
使用FastAPI和asyncio,你可以轻松实现并行执行任务,立即响应Web请求,并维护正在进行的后台任务。这个设计模式提高了应用程序的响应速度并增强了用户体验。祝编码愉快!
阅读英文
AI好书推荐
AI日新月异,再不学来不及了。但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?