破解:既要及即时相应,又要并行运行后台任务? FastAPI + asyncio

开发响应迅速且高效的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}

工作原理

  1. 定义异步函数 :我们定义了三个异步函数,每个函数通过使用await asyncio.sleep()来模拟延迟任务。

  2. 创建FastAPI应用 :我们初始化了一个FastAPI应用实例,app

  3. 设计端点/run-tasks端点触发我们定义的任务执行。

  4. 执行和等待任务

    • 第一个任务(first_sub_function())直接等待(await),这意味着端点会等待其完成。

    • 其他两个任务(second_sub_function()third_sub_function())通过asyncio.create_task()启动为后台任务。

  5. 即时响应:端点在第一个任务结果可用时立即返回,而其余任务继续在后台运行。

运行应用程序

要运行FastAPI应用程序,将代码保存为文件(例如main.py),然后运行以下命令:

bash 复制代码
uvicorn main:app --reload

结论

使用FastAPI和asyncio,你可以轻松实现并行执行任务,立即响应Web请求,并维护正在进行的后台任务。这个设计模式提高了应用程序的响应速度并增强了用户体验。祝编码愉快!

阅读英文

turbocharge-your-fastapi

AI好书推荐

AI日新月异,再不学来不及了。但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?

人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典

北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理

相关推荐
一叶龙洲5 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
敖行客 Allthinker6 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
j7~8 小时前
【Linux】二十二.《Linux 信号机制完全指南:表示、捕捉与处理》
linux·信号处理·volatile·可入重函数·保存信号
踏月的造梦星球8 小时前
达梦数据库执行计划与性能分析入门:EXPLAIN、AUTOTRACE 与 ET
服务器·数据库·oracle
观山岳五楼9 小时前
Ubuntu 24 怎么使用Ubuntu 20 的镜像源
linux·运维·ubuntu
星夜夏空999 小时前
网络编程(1)
服务器·网络
川石课堂软件测试9 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
m0_715646769 小时前
20260720
linux·arm
寒晓星9 小时前
[linux]线程及多线程
linux·运维