57 lines
2.6 KiB
Python
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)}") |