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

开发响应迅速且高效的Web应用程序是开发者的首要目标之一。一个常见的需求是,当触发一个端点时能够并行执行多个任务,但在第一个任务完成后立即返回响应,同时其余任务继续在后台运行。

挑战

假设在触发一个端点时,你有三个耗时任务需要运行,但你希望在第一个任务完成后立即提供响应,而剩下的任务继续在后台运行。

使用FastAPI和asyncio

FastAPI结合Python的asyncio库,提供了一种强大的方法来应对这种需求。下面是一个简单而有效的方法来解决这个问题。

代码


from fastapi import FastAPIimport asyncioapp = 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),然后运行以下命令:


uvicorn main:app --reload

结论

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

阅读英文

turbocharge-your-fastapi

AI好书推荐

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造游戏APP:面向对象编程的实战演练

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、项目背景与架构概览 二、类的设计与实现 三、面向对象编程的实践 四、游戏循环与事件…

Vue CLI 的服务介绍与使用(2024-05-20)

1、介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service),该依赖: 可升级…

详解混合A*算法Hybrid A*

混合A算法(Hybrid A)是一种改进的路径规划算法,特别针对车辆动力学进行了优化。以下是对混合A*算法的详细解释: 一、算法背景 混合A算法是在A算法的基础上发展而来的,旨在解决A算法在高维连续空间中的效率问题以及运动约束的问题。A算法虽然广泛应用于图或者网络中的路径…

linux中系统调用的原理

Linux中系统调用的原理涉及到用户态和内核态之间的切换以及参数传递。下面我将以用户态调用libc的time()函数为例,详细说明整个代码处理流程: 用户态代码调用time()函数: 用户程序包含<time.h>头文件,调用time()函数,并传入一个time_t类型的指针参数,用于存储获取到…

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元&#xff08;ALU&#xff09; 3.1.2 累加器A 3.1.3 程序状态字寄存器&#xff08;PSW&#xff09…

Spring6框架中依赖注入的多种方式(推荐构造器注入)

你好&#xff0c;这里是codetrend专栏“Spring6全攻略”。 一个典型的企业应用程序不是由单个对象&#xff08;或在Spring术语中称为bean&#xff09;组成的。 即使是最简单的应用程序也有一些对象一起工作&#xff0c;呈现给最终用户看到的内容形成一个连贯的应用程序。 要…

谈谈你对 vue 的理解 ?

1.谈谈你对 vue 的理解 ? 官方: Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层 2. 声明式框架 Vue 的核心特点,用起来简单。那我们就有必要知道命令式和声明式的区别! 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程 声明…

【目标检测】关于YOLO系列算法中Confidence置信度的计算和理解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

esp32 idf开发中的常用命令

git config --global --unset http.proxy 取消代理 git config --global --unset https.proxy 取消代理 ipconfig/flushdns 清除dns缓存 idf.py fullclean ​​​​​​​ ​​​​​…

39、Flink 的窗口剔除器(Evictors)详解

Evictors Flink 的窗口模型允许在 WindowAssigner 和 Trigger 之外指定可选的 Evictor&#xff0c;通过 evictor(...) 方法传入 Evictor。 Evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素&#xff0c; Evictor 接口提供了两个方法实现此功能&#x…

LDAP: error code 32 - No Such Object

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Objec…

spring boot 的常用注解

Autowired与 Resource的区别 1、Autowired与Resource都是要装配bean Autowired是通过byType来注入 Resource是同通过byName来注入 一、Autowired Autowired默认是按类型&#xff08;type也就是参数化类型&#xff09;装配&#xff08;这个注解是属于spring的&#xff09;&am…

css 文本超过一行省略号显示、文本超过两行省略号显示

要使CSS文本在一行内显示&#xff0c;并在超过一行时显示省略号&#xff08;...&#xff09;&#xff0c;可以使用以下CSS样式&#xff1a; .text-ellipsis {white-space: nowrap; /* 文本不换行 */overflow: hidden; /* 隐藏超出容器的内容 */text-overflow: el…

深度学习中图像增强类别和作用

1. 基本几何变换 旋转 (Rotation)&#xff1a;随机旋转图像一定角度。 作用&#xff1a;使模型对物体方向的变化更具鲁棒性。平移 (Translation)&#xff1a;沿水平方向或垂直方向平移图像。 作用&#xff1a;增强模型对位置变化的鲁棒性。翻转 (Flip)&#xff1a;水平或垂直翻…

C语言基础(七)

C语言基础&#xff08;七&#xff09; constconst修饰变量const修饰指针 main函数传参GDB调试工具 const const修饰变量 const修饰变量&#xff1a;只读&#xff08;不可写&#xff09; const修饰指针 左数右指&#xff08;const在*的哪一侧&#xff09; 数 —— 数值不可修…

【前端每日基础】day21——js基础运算符

JavaScript 提供了丰富的运算符&#xff0c;用于执行各种操作&#xff0c;如算术运算、比较、逻辑运算等。以下是 JavaScript 中的主要运算符及其用法。其实运算符大体上各语言都大差不差&#xff0c;顶多是部分小细节会有不同&#xff0c;简单看看就好了。 算术运算符 加法 …

halcon C++ 图片中添加区域HRegion,循环读取HTuple

halcon C 图片中添加区域&#xff0c;循环读取HTuple HObject ho_ImageResult1; GenEmptyObj(&ho_ImageResult1); // 绘制区域到图片 PaintRegion(ho_Regions, ho_Image, &ho_ImageResult1, ((HTuple(255).Append(255)).Append(255)), "fill"); // 保存图片…

弱密码系统登录之后强制修改密码

在你登录的时候&#xff0c;获取到弱密码&#xff0c;然后将他存到vuex里面&#xff0c;在登录进去之后&#xff0c;index页面再去取&#xff0c;思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

【MySQL进阶之路 | 基础篇】存储过程

1. 存储过程概述 (1). 含义 : 存储过程就是一组经过预先编译的SQL语句的封装. (2). 执行过程 : 存储过程预先存储在MySQL服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器端发送调用存储过程的命令&#xff0c;服务器端就可以把预先存储好的这一系列SQL语…

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中&#xff0c;很多音频、视频网站下载资源都非常不方便&#xff0c;要么需要安装客户端&…