import time from fastapi import FastAPI from pydantic import BaseModel import uvicorn from multiprocessing import Process, Event, freeze_support, Manager from loguru import logger from liveMan import DouyinLiveWebFetcher, DouyinLiveWebReply from helper import PromptQueue, LiveChatConfig logger.add('log.log', encoding='utf-8', rotation="500MB") # FastAPI应用实例 app = FastAPI(title="直播状态控制接口") # 请求体模型 class SpeakingStatus(BaseModel): is_speaking: bool # 全局变量,用于在FastAPI进程中存储共享字典引用 app.state.shared_config = None # 接口:更新is_speaking状态 @app.post("/speaking-status", summary="更新说话状态") def update_speaking_status(status: SpeakingStatus): if app.state.shared_config is None: return {"error": "服务未初始化"} app.state.shared_config['is_speaking'] = status.is_speaking # logger.info(f"通过API更新is_speaking状态为: {status.is_speaking}") return { "message": "状态更新成功", "current_status": { "is_speaking": app.state.shared_config['is_speaking'], } } # 启动FastAPI服务的函数,接收共享字典作为参数 def start_fastapi_server(shared_config): # 将共享字典存储到FastAPI应用的状态中 app.state.shared_config = shared_config # 启动UVicorn服务器 uvicorn.run(app, host="0.0.0.0", port=8000) def fetch_user_chat_content(ws_open_event, queue): fetcher = DouyinLiveWebFetcher(ws_open_event, queue) fetcher.start() def reply_user_chat_content(queue, config): reply = DouyinLiveWebReply(queue, config) reply() if __name__ == '__main__': freeze_support() LiveChatConfig().update_chat_enable_status('启动中') with Manager() as manager: # 创建共享字典,包含所有需要的键 shared_config = manager.dict({ 'is_speaking': False }) queue = PromptQueue(10) ws_open_event = Event() # 创建进程时将共享字典传递给FastAPI服务 api_process = Process( target=start_fastapi_server, args=(shared_config,), name="FastAPI Server" ) fetch_process = Process( target=fetch_user_chat_content, args=(ws_open_event, queue) ) reply_process = Process( target=reply_user_chat_content, args=(queue, shared_config) ) # 启动所有进程 api_process.start() fetch_process.start() ws_open_event.wait() reply_process.start() # 等待所有进程完成 fetch_process.join() reply_process.join() api_process.join()