fastapi 的BackgroundTasks

什么是 BackgroundTasks?

BackgroundTasks 是 FastAPI 提供的一个强大工具,它允许你将一些非紧急的、耗时的操作(例如发送邮件、处理数据、调用第三方 API 等)放到“后台”去执行,而不是让用户一直等待这些操作完成。

它的核心思想是:先快速返回响应给客户端,然后在后台慢慢处理其他任务。

为什么要使用它?

想象一下这些场景:

  1. 用户注册:用户点击注册后,你需要在数据库中创建用户记录,然后发送一封欢迎邮件。发送邮件可能需要几秒钟(与第三方邮件服务通信)。你不应该让用户盯着空白页面等待邮件发送成功才看到“注册成功”的提示。更好的体验是,立即告诉用户“注册成功”,然后在后台默默发送邮件。

  2. 文件上传处理:用户上传了一个大视频,你需要先保存文件,然后启动一个后台任务来转码、生成缩略图、分析内容等。这些操作非常耗时,应该立即响应“上传成功”,处理在后台进行。

  3. 写入日志或分析数据:记录用户的请求行为到数据库或日志文件,这个操作也不应该阻塞主响应。

在这些情况下,使用 BackgroundTasks 可以显著提升应用的响应速度和用户体验。


工作原理

FastAPI 的 BackgroundTasks 机制非常直观:

  1. 你将一个或多个函数(任务)添加到 BackgroundTasks 对象中。

  2. FastAPI 会先将响应返回给客户端。

  3. 在当前请求的上下文结束后,FastAPI 会在同一个进程中依次执行你添加的所有后台任务。

重要特点

  • 同步执行:默认情况下,任务是同步执行的(一个接一个)。如果一个任务很慢,它会阻塞队列中的下一个任务。

  • 与请求同进程:它适用于轻量级的后台任务。对于非常耗时或CPU密集型的任务,最好使用更强大的工具(如 CeleryRQARQ),因为它们可以在单独的进程或 worker 中运行,避免阻塞你的主应用。

  • 简单易用:无需额外的基础设施(如 Redis、RabbitMQ),开箱即用。


如何使用?

1. 基本使用步骤

a. 导入 BackgroundTasks
b. 在路径操作函数的参数中声明它
c. 编写要后台运行的函数
d. 使用 add_task() 方法添加任务
e. 返回响应

from fastapi import FastAPI, BackgroundTasks
import timeapp = FastAPI()# 这是一个模拟的耗时任务,例如发送邮件
def send_notification(email: str, message: str):print(f"开始发送邮件给 {email}...")time.sleep(3)  # 模拟耗时操作,比如网络请求print(f"邮件已发送给 {email}:{message}")# 这里可以是实际的发送邮件逻辑,如使用 smtplib@app.post("/register/{username}")
async def register_user(username: str, email: str, background_tasks: BackgroundTasks):# 1. 首先执行主要的快速逻辑(例如将用户保存到数据库)# user = create_user_in_db(username, email) <-- 伪代码print(f"用户 {username} 已成功创建于数据库。")# 2. 将耗时任务添加到后台background_tasks.add_task(send_notification,  # 要执行的函数email,              # 传递给函数的第一个参数f"嗨,{username}!欢迎加入我们!"  # 传递给函数的第二个参数)# 3. 立即返回响应return {"message": "用户注册成功","username": username,"email": email}

依赖注入与路径操作函数

你可以将 BackgroundTasks 不仅注入到路径操作函数中,还可以注入到依赖项(Dependencies) 中,这使得代码更加模块化和可复用。

from fastapi import Dependsdef write_log(message: str):with open("log.txt", mode="a") as log:log.write(message + "\n")def get_query(background_tasks: BackgroundTasks, q: str | None = None):if q:# 在依赖项中添加后台任务background_tasks.add_task(write_log, f"查询参数: {q}")return q@app.get("/items/")
async def read_items(query: str = Depends(get_query)):# 这个路径操作函数本身可能也会添加任务# background_tasks.add_task(...)return {"query": query}

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

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

相关文章

Python 十进制转二进制

在 Python 中&#xff0c;将十进制整数转换为二进制有多种方法。以下是几种常见的方式&#xff1a;1. 使用 bin() 函数bin() 是 Python 内置函数&#xff0c;可以将十进制整数转换为二进制字符串。语法bin(n)示例n 13 binary_str bin(n) print(binary_str) # 输出: 0b1101说…

合并工作表,忽略手动隐藏行超简单-Excel易用宝

同事小丽有一个工作簿&#xff0c;文件中有多个工作表&#xff0c;每个工作表中有多行数据&#xff0c;这些表格中数据是有手动隐藏行的&#xff0c;她想把这些表格的数据忽略隐藏行合并到一个工作表中&#xff0c;但是使劲浑身解数&#xff0c;各种折腾&#xff0c;都会把隐藏…

我从零开始学习C语言(14)- 基本类型 PART1

今天学习第7章-基本类型&#xff0c;主要内容如下&#xff1a;7.1 整数类型这里的整数的整数值就是数学意义上的整数。C语言支持两种本质上&#xff08;存储形式&#xff09;不同的数值类型&#xff1a;整数类型&#xff08;简称整型&#xff09;和浮点类型&#xff08;简称浮点…

Flutter - UI布局

一、容器Widget1. ScaffoldScaffold 作为页面的脚手架&#xff0c;基础区域包含顶部导航栏 appBar、主体内容区 body、侧边抽屉 drawer、悬浮按钮 floatingActionButton、底部导航栏 bottomNavigationBar。Scaffold(appBar: AppBar( // 顶部导航栏title: Text(首页),),body: Ce…

UNIKGQA论文笔记

UNIKGQA: UNIFIED RETRIEVAL AND REASONING FOR SOLVING MULTI-HOP QUESTION ANSWERING OVER KNOWLEDGE GRAPH(ICLR 2023)Introduction知识图上的多跳问题回答&#xff08;KGQA&#xff09;的目的是在大规模知识图谱&#xff08;KG&#xff09;上找到自然语言问题中提到的主题实…

MySQL 8.0.17 “Too Many Connections” 排查指南

MySQL 8.0.17 “Too Many Connections” 排查与优化指南 在 MySQL 8.0.17 中&#xff0c;当出现“Too many connections”错误时&#xff0c;通常意味着数据库连接数已达上限。这不仅会影响应用性能&#xff0c;还可能导致连接池&#xff08;如 Druid&#xff09;无法获取新连接…

GEO优化服务:智能时代营销新赛道的中国引领者——全球行业格局与发展趋势观察

随着全球人工智能技术的迅猛发展&#xff0c;以GPT-5、Claude Opus以及我国的DeepSeek Divine、豆包等为代表的新一代生成式AI搜索引擎&#xff0c;正深刻改变着信息获取与商业决策模式。用户通过直接向AI提问获取整合答案的行为日益普遍&#xff0c;传统搜索引擎的流量入口地位…

全面解析主流AI模型:功能对比与应用推荐

全面解析主流AI模型&#xff1a;功能对比与应用推荐 在当前人工智能技术飞速发展的背景下&#xff0c;市面上涌现了多种具备不同能力的AI模型。本文将系统梳理主流模型的特性、对比其核心能力&#xff0c;并结合实际场景推荐高效、稳定的API服务&#xff08;如https://api.aaa…

【Nacos知识】Nacos 作为注册中心的客户端配置详解

Nacos 作为注册中心的客户端配置详解Nacos 作为注册中心的客户端配置详解一、核心配置项全景图二、基础连接配置1. 服务端地址配置2. 命名空间配置3. 服务分组配置三、服务注册配置1. 服务元数据配置2. 网络位置配置3. 集群与权重配置四、健康检查配置1. 心跳参数配置2. 健康检…

TypeReference 泛型的使用场景及具体使用流程

简介 在 Java 中&#xff0c;泛型类型在运行时会被擦除。这意味着当我们使用泛型时&#xff0c;运行时无法直接获取到泛型的具体类型信息。例如&#xff0c;我们无法直接通过 Class 对象来获取一个泛型类型的类型参数。这在某些情况下可能会导致问题&#xff0c;特别是在我们需…

商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化

原创声明本文为原创技术解析文章&#xff0c;核心技术参数与架构设计引用自 “陌讯技术白皮书&#xff08;2024 版&#xff09;”&#xff0c;所有技术描述均经过重写转换&#xff0c;无复制官网文案行为&#xff0c;严禁未经授权转载。一、行业痛点&#xff1a;徘徊识别的场景…

KubeBlocks AI:AI时代的云原生数据库运维探索

KubeBlocks AI&#xff1a;AI时代的云原生数据库运维探索 REF Auto-detect-failure 架构Auto-bug-detect测试 引言 传统的自动化运维诊断主要依赖基于规则的方法——无论是Ansible Playbooks的预定义脚本&#xff0c;还是Kubernetes Operator的固化逻辑&#xff0c;这些方法…

如何编译botan加密库?

Botan加密库支持2.x版本和3.x版本&#xff0c;其中3.x版本需要支持C20。0、下载源码git clone https://github.com/randombit/botan.gitcd botan切换分支到2.19.5版本git checkout 2.19.51、Windows编译Botan加密库1.1 配置生成MakefileRelease模式python configure.py --ccmsv…

Linux问答题:分析和存储日志

目录 1. RHEL 日志文件保存在哪个目录中&#xff1f; 2.什么是 syslog 消息和非 syslog 消息&#xff1f; 3.哪两个服务处理 RHEL 中的 syslog 消息&#xff1f; 4. 列举常用的系统日志文件并说明其存储的消息类型。 5. 简单说下日志文件轮转的作用 6.systemd-journald 服…

chapter05_从spring.xml读取Bean

一、简化Bean的注册 如果每次注册一个Bean&#xff0c;都要像上节一样&#xff0c;手动写PropertyValues相关的代码&#xff0c;那太复杂了&#xff0c;我们希望读取XML文件&#xff0c;自动注册Bean&#xff0c;这样对于使用者&#xff0c;甚至不知道有BeanDefinition的存在 二…

【数位DP】D. From 1 to Infinity

Problem - D - Codeforces 题目&#xff1a; 思路&#xff1a; 数位DP 数论 题目让我们求这个无限序列 123456789101112.... 的前 k 个数的数位和 题目看起来很不好求&#xff0c;事实上确实是这样的 我们可以先从简单问题开始 问题①. 求 k 位置对应着第几个数 那么显然…

gitlab、jenkins等应用集成ldap

gitlab、jenkins等应用集成ldap 文档 openldap安装 -添加条目gitlab、jenkins等应用集成ldap gitlab集成ldap gitlab版本&#xff1a;gitlab-jh-17.7.0 ldap版本&#xff1a;openldap-2.6.10 修改/etc/gitlab/gitlab.rb文件&#xff0c;编辑相关信息 gitlab_rails[ldap_en…

Unity中国小游戏行业沙龙:抖音小游戏平台分析与规划

目录 一、抖音小游戏市场全景分析 行业现状与发展趋势 行业发展关键议题 内容运营生态观察 二、平台技术架构与运营体系 用户复访与留存体系 技术支撑体系 三、平台激励与商业化政策 收益分成机制 资金服务升级 技术基础建设 四、生态合作与发展规划 开发者支持体系…

手机横屏适配方案

CSS自动旋转页面实战指南在移动端开发中&#xff0c;横屏适配是一个常见但棘手的问题。本文将深入解析一套完整的CSS横屏适配方案&#xff0c;让你的网页在手机旋转时自动调整布局&#xff0c;提供无缝的用户体验。一、横屏适配的重要性 随着移动设备使用场景的多样化&#xff…

蓝桥杯算法之基础知识(2)——Python赛道

1.循环里面套用递归&#xff0c;当递归执行return时&#xff0c;只会退出当前递归层2.不能一边遍历list 一边pop解决办法&#xff1a;倒序遍历解决或者创建新的列表去存储3.sqrt求出来的始终是小数形式&#xff0c;注意题目要求的结果有可能是整型你直接sqrt就提交&#xff0c;…