refactor(schedule): 异步化月度计划生成以避免阻塞

将月度计划的生成过程从同步阻塞模式重构为异步非阻塞模式。

在 `ScheduleManager` 中,当月度计划耗尽时,现在会通过调用新的 `trigger_generate_monthly_plans` 方法来启动一个后台生成任务,而不是 `await` 其完成。这可以防止在生成新计划时(可能耗时较长)阻塞日常任务的调度流程。

同时,修复了 `MonthlyPlanManager` 中一个排序逻辑错误,确保在计划数量超出上限时,正确删除最旧的计划而不是最新的。
This commit is contained in:
minecraft1024a
2025-08-30 12:01:04 +08:00
committed by Windpicker-owo
parent b65eb6dc81
commit 255c7e2efb
2 changed files with 17 additions and 11 deletions

View File

@@ -77,7 +77,7 @@ class MonthlyPlanManager:
if len(plans) > max_plans:
logger.warning(f"当前月度计划数量 ({len(plans)}) 超出上限 ({max_plans}),将自动删除多余的计划。")
# 按创建时间升序排序(旧的在前),然后删除超出上限的部分(新的)
plans_to_delete = sorted(plans, key=lambda p: p.created_at)[max_plans:]
plans_to_delete = sorted(plans, key=lambda p: p.created_at, reverse=True)[:len(plans)-max_plans]
delete_ids = [p.id for p in plans_to_delete]
delete_plans_by_ids(delete_ids)
# 重新获取计划列表
@@ -138,6 +138,14 @@ class MonthlyPlanManager:
finally:
self.generation_running = False
def trigger_generate_monthly_plans(self, target_month: Optional[str] = None):
"""
以非阻塞的方式启动月度计划生成任务。
这允许其他模块如ScheduleManager触发计划生成而无需等待其完成。
"""
logger.info(f"已触发 {target_month or '当前月份'} 的非阻塞月度计划生成任务。")
asyncio.create_task(self.generate_monthly_plans(target_month))
def _get_previous_month(self, current_month: str) -> str:
"""获取上个月的月份字符串"""
try: