From 6c714ad780a2e0c570a7bf1ef6cf22a75358455d Mon Sep 17 00:00:00 2001 From: AlanPaine Date: Tue, 7 Apr 2026 06:36:37 +0000 Subject: [PATCH] =?UTF-8?q?refactor(background):=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=9B=BF=E4=BB=A3BackgroundTasks=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构异步任务执行机制,将FastAPI的BackgroundTasks替换为独立的线程执行。修改了async_meeting_service,添加run_task_in_background方法创建守护线程,并在会议总结生成和音频上传后的自动总结监控中调用。这消除了对API层BackgroundTasks参数的依赖,使服务层更独立且便于测试。 --- backend/app/api/endpoints/meetings.py | 2 +- backend/app/services/async_meeting_service.py | 15 ++++++++++----- backend/app/services/audio_service.py | 8 ++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/backend/app/api/endpoints/meetings.py b/backend/app/api/endpoints/meetings.py index a0525d7..a8fefe4 100644 --- a/backend/app/api/endpoints/meetings.py +++ b/backend/app/api/endpoints/meetings.py @@ -1105,7 +1105,7 @@ def generate_meeting_summary_async(meeting_id: int, request: GenerateSummaryRequ }) # 传递 prompt_id 和 model_code 参数给服务层 task_id = async_meeting_service.start_summary_generation(meeting_id, request.user_prompt, request.prompt_id, request.model_code) - background_tasks.add_task(async_meeting_service._process_task, task_id) + async_meeting_service.run_task_in_background(async_meeting_service._process_task, task_id) return create_api_response(code="200", message="Summary generation task has been accepted.", data={ "task_id": task_id, "status": "pending", "meeting_id": meeting_id }) diff --git a/backend/app/services/async_meeting_service.py b/backend/app/services/async_meeting_service.py index 09fc43e..ad1903b 100644 --- a/backend/app/services/async_meeting_service.py +++ b/backend/app/services/async_meeting_service.py @@ -6,6 +6,7 @@ import uuid import time import os import re +import threading from datetime import datetime from typing import Optional, Dict, Any, List from pathlib import Path @@ -26,9 +27,14 @@ class AsyncMeetingService: self.redis_client = redis.Redis(**REDIS_CONFIG) self.llm_service = LLMService() # 复用现有的同步LLM服务 + def run_task_in_background(self, target, *args): + thread = threading.Thread(target=target, args=args, daemon=True) + thread.start() + return thread + def start_summary_generation(self, meeting_id: int, user_prompt: str = "", prompt_id: Optional[int] = None, model_code: Optional[str] = None) -> str: """ - 创建异步总结任务,任务的执行将由外部(如API层的BackgroundTasks)触发。 + 创建异步总结任务。 Args: meeting_id: 会议ID @@ -70,7 +76,7 @@ class AsyncMeetingService: def _process_task(self, task_id: str): """ - 处理单个异步任务的函数,设计为由BackgroundTasks调用。 + 处理单个异步任务的函数。 """ print(f"Background task started for meeting summary task: {task_id}") try: @@ -137,7 +143,7 @@ class AsyncMeetingService: ): """ 监控转录任务,完成后自动生成总结 - 此方法设计为由BackgroundTasks调用,在后台运行 + 此方法在独立后台线程中运行 Args: meeting_id: 会议ID @@ -194,8 +200,7 @@ class AsyncMeetingService: ) print(f"[Monitor] Summary task {summary_task_id} started for meeting {meeting_id}") - # 在后台执行总结任务 - self._process_task(summary_task_id) + self.run_task_in_background(self._process_task, summary_task_id) except Exception as e: error_msg = f"Failed to start summary generation: {e}" diff --git a/backend/app/services/audio_service.py b/backend/app/services/audio_service.py index ea39ca6..331d8a7 100644 --- a/backend/app/services/audio_service.py +++ b/backend/app/services/audio_service.py @@ -141,16 +141,16 @@ def handle_audio_upload( transcription_task_id = transcription_service.start_transcription(meeting_id, file_path) print(f"Transcription task {transcription_task_id} started for meeting {meeting_id}") - # 5. 如果启用自动总结且提供了 background_tasks,添加监控任务 - if auto_summarize and transcription_task_id and background_tasks: - background_tasks.add_task( + # 5. 如果启用自动总结,启动后台监控任务 + if auto_summarize and transcription_task_id: + async_meeting_service.run_task_in_background( async_meeting_service.monitor_and_auto_summarize, meeting_id, transcription_task_id, prompt_id, model_code ) - print(f"[audio_service] Auto-summarize enabled, monitor task added for meeting {meeting_id}, prompt_id: {prompt_id}, model_code: {model_code}") + print(f"[audio_service] Auto-summarize enabled, monitor task started for meeting {meeting_id}, prompt_id: {prompt_id}, model_code: {model_code}") except Exception as e: print(f"Failed to start transcription: {e}")