From 556903c135246c2c2d3857f7dba014e89cb153c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=82=E5=A3=B9?= <137363396+KBVsent@users.noreply.github.com> Date: Sun, 7 Jun 2026 11:52:11 +0900 Subject: [PATCH] fix: keep strong refs to pipeline tasks to prevent GC (#8618) --- astrbot/core/event_bus.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/astrbot/core/event_bus.py b/astrbot/core/event_bus.py index 70b5f054e..c2a96273e 100644 --- a/astrbot/core/event_bus.py +++ b/astrbot/core/event_bus.py @@ -33,6 +33,8 @@ class EventBus: # abconf uuid -> scheduler self.pipeline_scheduler_mapping = pipeline_scheduler_mapping self.astrbot_config_mgr = astrbot_config_mgr + # 持有正在执行的 pipeline 任务的强引用, 防止 task 在 pending 状态被 GC 回收 + self._pending_tasks: set[asyncio.Task] = set() async def dispatch(self) -> None: while True: @@ -47,7 +49,18 @@ class EventBus: f"PipelineScheduler not found for id: {conf_id}, event ignored." ) continue - asyncio.create_task(scheduler.execute(event)) + task = asyncio.create_task(scheduler.execute(event)) + self._pending_tasks.add(task) + task.add_done_callback(self._on_task_done) + + def _on_task_done(self, task: asyncio.Task) -> None: + """pipeline 任务结束回调: 移除强引用并暴露未捕获的异常""" + self._pending_tasks.discard(task) + if task.cancelled(): + return + exc = task.exception() + if exc is not None: + logger.error("pipeline 任务执行异常", exc_info=exc) def _print_event(self, event: AstrMessageEvent, conf_name: str) -> None: """用于记录事件信息