【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录

一、代码示例

二、执行说明

[(一) 调用任务执行接口](#(一) 调用任务执行接口)

[(二) 监控任务进度](#(二) 监控任务进度)


实现功能:

  1. 注册后台任务(如:邮件发送、文件处理等异步场景,不影响接口返回)
  2. 监控后台任务执行进度(进度条功能)
  3. 支持根据任务ID查询对应任务进度

一、代码示例

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import random
import asyncio

from typing import List, Dict
from fastapi import FastAPI, BackgroundTasks, WebSocket

app = FastAPI()

# 用于存储连接的 WebSocket 实例
connected_websockets: Dict[int, List[WebSocket]] = {}


@app.websocket("/ws/{task_id}/")
async def websocket_endpoint(websocket: WebSocket, task_id: int):
    """WebSocket路由,用于接收任务进度"""
    await websocket.accept()
    connected_websockets.setdefault(task_id, []).append(websocket)
    try:
        while True:
            await websocket.receive_text()
    except:
        connected_websockets[task_id].remove(websocket)


@app.post("/task/{task_id}/")
async def start_task(background_tasks: BackgroundTasks, task_id: int):
    """注册后台任务"""
    background_tasks.add_task(process_task, task_id=task_id)
    return {"task_id": task_id}


async def process_task(task_id):
    """处理任务的后台任务"""
    progress = 0
    while progress < 100:
        await asyncio.sleep(1)
        progress += random.randint(1, 10)
        progress = min(progress, 100)
        for ws in connected_websockets[task_id]:
            await ws.send_json({"task_id": task_id, "progress": progress})
    await asyncio.sleep(1)


# 启动应用
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

二、执行说明

(一) 调用任务执行接口

  1. 启动服务后,访问:http://127.0.0.1:8000/docs
  2. POST请求:http://127.0.0.1:8000/task/1/,指定任务ID为1

(二) 监控任务进度

  1. 安装websocket请求工具:npm install -g wscat
  2. 终端输入wscat -c ws://127.0.0.1:8000/ws/1/,监控任务ID为1的执行进度
相关推荐
微学AI1 小时前
我把 800 行报错日志压成一张排障卡:用蓝耘元生代做 FastAPI 日志根因分析
网络·oracle·fastapi
捧 花1 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
不灭的程序员阿澄2 小时前
Nginx 容器化部署实战:SPA 路由、Cookie 透传与 WebSocket 全配置详解
websocket·nginx·状态模式
卷无止境2 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
练习两年半的攻城狮4 小时前
FastAPI + LlamaIndex Agent 流式对话踩坑实录
fastapi·llamaindex
宠友信息1 天前
IM系统开发技术路线分析,即时通讯源码助力快速搭建聊天应用
java·spring boot·redis·websocket·mysql·uni-app·vue
oooo_z1 天前
WebSocket实时行情推送API实战:用iTick搭一个盯盘小工具
网络·websocket·网络协议
卷无止境1 天前
Linux + Docker + FastAPI 工程化实践指南
后端·python·fastapi
皮卡丘不断更2 天前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
智购科技自动售卖机厂家2 天前
2026自动售货机OTA升级系统设计:从全量升级到差分升级的带宽优化工程实践~YH
大数据·人工智能·numpy·pyqt·fastapi