当前位置: 首页 > news >正文

Python开发:BackgroundTasks和asyncio.create_task()的区别

在前一篇文章中https://blog.csdn.net/zhang_jiamin/article/details/153329238?spm=1011.2415.3001.5331介绍了接口的场景设计,采用的设计方案是:后端异步任务 + 轮询进度接口,让前端立即得到“任务已开始”的响应,然后再异步处理解析任务。

其中涉及到了后端异步任务,有两个常用方法:
BackgroundTasks和asyncio.create_task()

先说主要区别:

特性BackgroundTasks(FastAPI内置)asyncio.create_task()(原生异步)
触发时机在响应返回之后由 FastAPI 调用在调用时立即启动后台任务
作用范围仅限当前请求上下文(response 完成后运行)独立运行,不依赖请求上下文
适合的场景轻量、短时间任务(如发通知、写日志)长耗时任务(下载、解析、训练)
生命周期绑定请求生命周期,随请求结束独立任务,可持续运行几分钟甚至几小时
错误处理异常不会被捕获到主协程可自行捕获、记录日志
状态追踪不方便管理(一次性)可以保存在全局 dict / Redis 中,支持查询进度

我选择的是:asyncio.create_task()

原因:
我的场景是:后端下载和解析 .aab 文件,大约需要 1 分钟。
属于一个耗时任务,同时还希望:

  • 前端立即返回 task_id
  • 后端继续后台运行
  • 前端可查询进度/结果

BackgroundTasks 更适合「小收尾工作」的场景(如发邮件、打日志)。

如果使用使用 BackgroundTasks:

from fastapi import BackgroundTasks@router.post("/app/aabParse")
async def parse_aab_api(url: str = Form(...), background_tasks: BackgroundTasks):background_tasks.add_task(download_and_parse, url)return {"message": "任务开始执行"}

会出现:

  • FastAPI 会等响应返回后才启动任务(非实时)。
  • 无法获取 task_id,也无法查询任务状态。
  • 若进程重启,任务会丢失。

使用 asyncio.create_task()

task_id = str(uuid.uuid4())
asyncio.create_task(process_aab_task(task_id, url))
return {"task_id": task_id}

优点:

  • 启动时立刻异步执行;
  • 可保存 task_id;
  • 可在 /status/{task_id} 接口轮询结果;
  • 异常日志可控;
  • 扩展性强(可后续接入 Celery 或 Redis)。

最终代码如下

@router.post("/app/aabParse")
async def parse_aab_api(url: str = Form(...)):logger.info(f'[parse_aab_api] url: {url}')task_id = str(uuid.uuid4())task = asyncio.create_task(process_aab_task(task_id, url))async with tasks_lock:tasks[task_id] = {"status": "processing", "result": None, "task": task}return JSONResponse(content={"code": 0,"message": "success","data": {"task_id": task_id,"task_message": "任务已开始,请稍后查询结果"}})
http://www.dtcms.com/a/515934.html

相关文章:

  • InnoDB 独立表空间(ibd 文件)迁移实战指南
  • 22_AI智能体开发架构搭建之基于Redis构建高性能AI对话记忆存储服务实践
  • SIMPLE
  • 企业专业网站建设wordpress炫酷背景
  • MTPA算法原理及仿真验证
  • 【记录62】网站输入框搜索内容页面定位
  • 2025年新版ADB工具箱下载+驱动+ADB指令集+fastboot刷机ROOT工具
  • 上海网站建设平台站霸网络快速提升关键词排名软件
  • 【Android】从源码角度理解Handler机制
  • docker技术之部署docker
  • node框架做网站国外浏览器推荐
  • 悬赏平台 wordpress免费网站优化怎么做
  • java数据结构--LinkedList与链表
  • 【笔记--如何安装python环境】
  • 汇川H5U 威纶通HMI双仿真编程
  • 平均指数移动(EMA)
  • 可灵AI邀请码
  • 做外贸的网站怎么建立矿大师德建设网站
  • C语言需要掌握的基础知识点之前缀和
  • Java Optional orElse orElseGet orElseThrow()
  • windows10 wordpress十堰seo优化
  • 优选算法:01 双指针巧解移动零问题
  • 消息队列Kafka
  • 做游戏陪玩网站连锁销售网站制作
  • 【数字逻辑】数字逻辑实验实战:74HC151实现逻辑函数+74HC138搭全加器(附接线步骤+避坑指南)
  • Ubuntu上vue3 vite使用MBTiles搭建地图服务器
  • CClink转EtherCAT协议转换落地——汇川PLC管控球磨机CClink伺服案例
  • wordpress handsome长沙seo免费诊断
  • ChatGPT Atlas 发布:把 AI 直插进浏览器的一次重构
  • 第1章:初识Linux系统——第9节:安装服务软件、维护文件系统安全与文件权限配置实例