破解:既要及即时相应,又要并行运行后台任务? 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 从业者,本书都能满足您的需求。 那为什么还要等呢?

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

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

相关推荐
Stark-C7 分钟前
7400MB/s&5050TBW完美结合,全新希捷酷玩530R SSD体验评测
服务器·网络·数据库
牧羊狼的狼27 分钟前
阿里云服务器-宝塔面板安装【保姆级教程】
运维·服务器·阿里云·宝塔
高峰聚焦37 分钟前
【Ubuntu】Netplan静态网络配置
linux·运维·ubuntu
冯一川1 小时前
Arm核的Ubuntu系统上安装Wireshark
linux·ubuntu·wireshark
wgc2k1 小时前
Java游戏服务器开发流水账(2)开发中Maven的管理
java·服务器·游戏
原小明1 小时前
Ubuntu 22.04 出现 ‘Temporary failure resolving‘ 解决方案
linux·运维
Jerry&Louis1 小时前
【Ubuntu】fcitx5 + Rime(中州韵)好用的Linux中文输入法
linux·ubuntu
o0o_-_1 小时前
【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列
linux·ubuntu·llama
敲上瘾1 小时前
数据库(MySQL)基础
linux·数据库·mysql
XY.散人1 小时前
初识Linux · 传输层协议TCP · 上
linux·网络·tcp/ip