Files
banban/talkingq-url/services/schedule_session_cleanup.py
2026-03-24 15:04:36 +08:00

57 lines
2.6 KiB
Python

import asyncio
from config import settings
from services.audio_session import audio_session_manager
from utils.logger import session_logger
from services.conversation_history import conversation_history_manager
async def run_in_executor(func, *args):
loop = asyncio.get_running_loop()
return await loop.run_in_executor(None, func, *args)
async def background_cleanup_task():
try:
while True:
await asyncio.sleep(settings.cleanup_interval)
current_time = asyncio.get_running_loop().time()
audio_sessions_to_clean = []
sessions = await audio_session_manager.get_all_sessions()
for session_key, session in sessions:
device_id, session_id = session_key
if current_time - session.last_activity_time > settings.session_timeout:
audio_sessions_to_clean.append(session_key)
session_logger.info(
device_id,
"cleanup",
f"清理过期的音频会话, 超时: {settings.session_timeout}"
)
for session_key in audio_sessions_to_clean:
await audio_session_manager.remove_session(session_key)
role_histories_to_clean = []
for (device_id, role_key), history in conversation_history_manager.role_histories.items():
if current_time - history.last_interaction_time > settings.conversation_history_timeout:
role_histories_to_clean.append((device_id, role_key))
session_logger.info(
device_id,
"cleanup",
f"发现过期的对话历史缓存: {role_key}, 超时: {settings.conversation_history_timeout}"
)
for device_id, role_key in role_histories_to_clean:
cache_key = (device_id, role_key)
if cache_key in conversation_history_manager.role_histories:
del conversation_history_manager.role_histories[cache_key]
session_logger.info(
device_id,
"cleanup",
f"已从内存中清理对话历史: {role_key}"
)
except asyncio.CancelledError:
session_logger.info("system", "cleanup", "后台清理任务已取消")
except Exception as e:
session_logger.error("system", "cleanup", f"后台清理任务出错: {str(e)}")