fix(sub_agent): 修复 wait_for_completion 因 _load_state 替换 tasks 字典导致的引用失效
This commit is contained in:
parent
6618ab03dc
commit
af56de6812
@ -264,11 +264,16 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi
|
|||||||
return {"success": False, "status": task.get("status"), "message": "子智能体已结束。"}
|
return {"success": False, "status": task.get("status"), "message": "子智能体已结束。"}
|
||||||
|
|
||||||
real_task_id = task["task_id"]
|
real_task_id = task["task_id"]
|
||||||
running_task = self._running_tasks.get(real_task_id)
|
|
||||||
deadline = time.time() + (timeout_seconds or task.get("timeout_seconds") or SUB_AGENT_DEFAULT_TIMEOUT)
|
deadline = time.time() + (timeout_seconds or task.get("timeout_seconds") or SUB_AGENT_DEFAULT_TIMEOUT)
|
||||||
|
|
||||||
while time.time() < deadline:
|
while time.time() < deadline:
|
||||||
self.reconcile_task_states()
|
self.reconcile_task_states()
|
||||||
|
# 关键:其他线程(如前端轮询 /api/sub_agents)可能调用 _load_state()
|
||||||
|
# 并替换 self.tasks 字典,导致旧 task 引用失效。每次循环重新获取引用。
|
||||||
|
task = self.tasks.get(real_task_id)
|
||||||
|
if not task:
|
||||||
|
return {"success": False, "error": "未找到对应的子智能体任务"}
|
||||||
|
running_task = self._running_tasks.get(real_task_id)
|
||||||
status = task.get("status")
|
status = task.get("status")
|
||||||
|
|
||||||
# 已到达终态:返回最终结果(持续 reconcile 直到 final_result 就绪)
|
# 已到达终态:返回最终结果(持续 reconcile 直到 final_result 就绪)
|
||||||
@ -278,6 +283,7 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi
|
|||||||
# 终态但 final_result 尚未写入,短暂等待后重试
|
# 终态但 final_result 尚未写入,短暂等待后重试
|
||||||
time.sleep(SUB_AGENT_STATUS_POLL_INTERVAL)
|
time.sleep(SUB_AGENT_STATUS_POLL_INTERVAL)
|
||||||
self.reconcile_task_states()
|
self.reconcile_task_states()
|
||||||
|
task = self.tasks.get(real_task_id) or task
|
||||||
if task.get("final_result"):
|
if task.get("final_result"):
|
||||||
return task["final_result"]
|
return task["final_result"]
|
||||||
return {"success": False, "status": status, "message": "子智能体已结束,但未获取到结果。"}
|
return {"success": False, "status": status, "message": "子智能体已结束,但未获取到结果。"}
|
||||||
@ -285,6 +291,7 @@ class SubAgentManager(SubAgentStateMixin, SubAgentStatsMixin, SubAgentCreationMi
|
|||||||
# asyncio Task 已结束但状态可能还没同步:等待 final_result 就绪
|
# asyncio Task 已结束但状态可能还没同步:等待 final_result 就绪
|
||||||
if running_task and running_task.done():
|
if running_task and running_task.done():
|
||||||
self.reconcile_task_states()
|
self.reconcile_task_states()
|
||||||
|
task = self.tasks.get(real_task_id) or task
|
||||||
if task.get("final_result"):
|
if task.get("final_result"):
|
||||||
return task["final_result"]
|
return task["final_result"]
|
||||||
# 结果尚未落盘,继续轮询,避免把「已创建」误判为失败
|
# 结果尚未落盘,继续轮询,避免把「已创建」误判为失败
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user