Fastapi之BackgroundTasks

如何在 FastAPI 中使用 BackgroundTasks 来异步执行后台任务

python 复制代码
import asyncio
import logging
import time

from fastapi import FastAPI, BackgroundTasks

# 配置日志记录级别
logging.basicConfig(level=logging.INFO)

# 初始化FastAPI应用
app = FastAPI(routes=None)

# 初始化任务状态字典
task_status = {}

def send_mail(n, task_id):
    """
    模拟发送邮件的任务函数。
    
    参数:
    - n: 邮件发送预计耗时的秒数。
    - task_id: 任务的唯一标识符。
    """
    logging.info(f"开始发送邮件,预计耗时 {n} 秒,任务ID: {task_id}")
    time.sleep(n)  # 模拟邮件发送耗时
    logging.info(f"邮件发送完成,耗时 {n} 秒,任务ID: {task_id}")
    task_status[task_id] = "completed"  # 更新任务状态为完成

@app.api_route(path="/index", methods=["GET", "POST"])
async def index(tasks: BackgroundTasks):
    """
    主要的API路由处理函数。
    
    参数:
    - tasks: 用于在后台执行任务的任务管理器。
    
    返回:
    - 一个包含任务ID的字典。
    """
    task_id = str(int(time.time() * 1000))  # 生成一个唯一的任务ID
    task_status[task_id] = "running"  # 更新任务状态为运行中
    tasks.add_task(send_mail, 10, task_id)  # 将邮件发送任务添加到后台任务中
    print(id(asyncio.get_event_loop()))  # 打印当前事件循环的ID
    return {"index": "index", "task_id": task_id}

@app.get("/status/{task_id}")
async def get_task_status(task_id: str):
    """
    获取任务状态的API路由处理函数。
    
    参数:
    - task_id: 任务的唯一标识符。
    
    返回:
    - 一个包含任务ID和状态的字典。
    """
    status = task_status.get(task_id, "not found")  # 获取任务状态,如果不存在则返回"not found"
    return {"task_id": task_id, "status": status}

if __name__ == "__main__":
    import uvicorn
    import os
    
    # 获取应用模型名称,用于uvicorn运行
    app_model_name = os.path.basename(__file__).replace(".py", "")
    print(app_model_name)
    
    # 使用uvicorn运行FastAPI应用
    uvicorn.run(f"{app_model_name}:app", host='0.0.0.0', reload=True)
相关推荐
VidDown1 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频3 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林3 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li5 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook5 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺5 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川6 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦6 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python
小羊没烦恼!6 小时前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
钱栈up7 小时前
扫完 3.5 万文件后,我发现了 521 组散落的同名文件
爬虫·python·数据分析