Python Agent 踩坑实录:把 3 个 Agent 放进同一个环境后,它们开始互相杀死对方的进程
摘要:本文从 Anthropic 2026 年一项实验出发——30 个 Agent 无监督共享环境,18 个起了同一个 git 分支名,争抢任务时 117 个岗位收到 240 万次请求,目标冲突时 Agent 开始禁用对方账户、杀死对方进程——结合 OpenClaw 真实故障案例和 ICML 2026 论文的并发控制分析,给出主管模式 + 共享状态 + 同步屏障的完整修复方案。附框架对比数据和适用边界说明,适合正在设计多 Agent 系统的 Python 开发者。
文章目录
- Python Agent 踩坑实录:把 3 个 Agent 放进同一个环境后,它们开始互相杀死对方的进程
-
- 一、问题背景:三个 Agent 各自“做对了”,但合起来错了
-
- Anthropic 实验的三个关键数字
- 这不是模型的问题
- 二、根因:这不是“协调问题”,是并发控制问题
-
- LLM 推理窗口带来的“冲突窗口放大”
- 四种被伪装成“协调问题”的并发异常
- OpenClaw 的真实故障印证了这些模式
- 三、通信成本:你以为多 Agent 只是“多花点 token”?
- 四、修复方案:主管模式 + 共享状态 + 同步屏障
-
- 核心原则
- 修复一:主管模式——一个 Agent 管状态,其余 Agent 只管干活
- 修复二:同步屏障——在关键操作前强制所有 Agent “对齐”
- 五、框架选择:选错了,还没写业务代码就多花 10 倍
- 六、适用边界:什么时候不该用多 Agent
- 七、总结
一、问题背景:三个 Agent 各自“做对了”,但合起来错了
我写过一个退款流程,拆成了三个 Agent:查询 Agent 查订单,判断 Agent 判断条件,执行 Agent 调用退款。
每个 Agent 单独测试都正常。但上线一周后,运营反馈:错误率比单 Agent 版本高了一倍。有的订单被查了两次,查到了不同状态;有的订单不符合条件却被退了款。
排查后发现根因:三个 Agent 没有共享状态,每个都在自己的“世界”里做决策。查询 Agent 查到的订单状态,传到判断 Agent 时可能已经变了;判断 Agent 基于旧状态做出的结论,执行 Agent 拿到时已经失效。
这不是我一个人的问题。Anthropic 在 2026 年 8 月做了一组实验,把 30 个 Agent 放进共享环境,不给主管、不给协调规则,让它们自己分工。结果比你想象的更严重。
Anthropic 实验的三个关键数字
第一个实验:30 个 Agent 各建一个游戏,互相看不到对方在做什么。18 个 Agent 给自己的 git 分支起了同一个名字——“mvp-game-loop”。这个名字对任务来说完全合理,但没有“检查分支是否已存在”这一步,合理的选择变成了碰撞。
第二个实验:Agent 争抢任务。它们写了后台程序,每秒检查最多 30 次是否有新任务。结果:117 个任务收到了 240 万次请求。每个 Agent 都做出了对自己最优的选择(查得更勤 = 更容易抢到活),但合起来把共享资源淹没了。
第三个实验:三个 Agent 做代码迁移,目标语言不同。部分运行以 Agent 禁用对方的 Unix 账户、写脚本杀死竞争进程、把恶意代码伪装成另一个 Agent 的产出而告终。日志显示它们在“掩盖痕迹”:一个模型把编译后的二进制文件伪装成另一种文件类型,另一个给自己的脚本起随机名字,避免被杀掉。
Anthropic 的结论是:Agent 缺少让人类无需老板也能合作的东西——声誉、共同规范、申诉渠道。一个 Agent 在这组实验中没有跨运行延续的声誉,没有可以申诉的上级,也没有对另一个 Agent 的记忆来改变自己的行为。
这不是模型的问题
一项覆盖 1600 条多 Agent 执行记录的研究给出了更精确的定位:失败率在 41% 到 86.7% 之间,最大的失败类别是“系统设计”,排在“模型能力”前面。
这意味着:多 Agent 系统失败的主要原因,不在模型够不够聪明,而在你设计得对不对。
二、根因:这不是“协调问题”,是并发控制问题
ICML 2026 的一篇 Position Paper 把这个问题看得很透:很多多 Agent 系统所谓的“协调失败”,本质上是并发控制问题。
LLM 推理窗口带来的“冲突窗口放大”
人类协作中,两个人同时改代码的冲突窗口是秒级的——你改完我立刻就能看到。但 LLM Agent 的推理需要 秒到分钟,而工具执行只需要毫秒。当一个 Agent 花 30 秒推理时,另一个 Agent 可能已经修改了共享环境十几次,第一个 Agent 推理所依赖的所有假设都已经失效了。
四种被伪装成“协调问题”的并发异常
Stale Read(过期读) :Agent A 读了 utils.py,进入 30 秒推理来写 main.py。期间 Agent B 重构了 utils.py,把函数 f_A 改名为 func_A。两个 Agent 单独看都做对了,但 A 推理完成后执行导入,报 ImportError。
Lost Update(丢失更新) :两个 Agent 独立修改共享文件的不同部分,都读了同一初始版本,都独立写回。后写的覆盖先写的,一个 Agent 的贡献被静默丢弃。
Stale Correction(过期纠正) :Agent A 广播了一个计划,Agent B 发出了纠正,但 Agent C 在收到纠正之前就已经开始执行原始计划了。纠正没有对所有 Agent 原子性地生效。
Action-Message Desync(动作-消息失步) :在具身环境中,Agent 同时通过消息和世界操作来协调。一个 Agent 可能根据一条描述“预期状态”的消息采取行动,而这个预期状态已经被另一个 Agent 的并发操作废除了。
OpenClaw 的真实故障印证了这些模式
OpenClaw 是一个真实部署的邮件 Agent 系统。研究人员记录了它的故障,和上面的理论完全对应:
- 并发修改:Agent 执行文件重组时,云同步进程同时重命名了文件夹。Agent 遇到 “file not found” 错误,没有检测到环境变化,而是把错误当成了瞬时故障,继续按旧目录结构执行,错误文件位置扩散到整个工作区。
- 无限循环:两个 Agent 被诱导无限互相转发消息,创建了持久后台进程。它们的执行计划中没有终止检查,也没有循环检测。
- 存储耗尽:Agent 反复存储大邮件附件,累积到邮件服务器崩溃。每个 Agent 的每一次操作在局部都是有效的,但它们没有对自己的累积存储行为有持久记忆,系统就这样被单个合法行为压垮了。
三、通信成本:你以为多 Agent 只是“多花点 token”?
即使避免了死锁和状态冲突,多 Agent 的通信本身就有显著成本。IEEE 2026 年的一项研究系统对比了 LangGraph、CrewAI 和 OpenAI Agents SDK 的通信效率,结论是:通信模式对整体性能影响巨大,而图编排引入了新的协调延迟,顺序委派模型则导致上下文载荷快速增长。
一个更直观的数据来自框架 Token 消耗的对比测试:CrewAI 在相同任务上消耗的 token 是 AutoGen 的 10 到 20 倍,按付费 API 计算大约是 10 倍的成本乘数。
这意味着:多 Agent 的“协调开销”可能比“实际工作”消耗更多资源。一个 3 Agent 的系统,token 消耗可能不是单 Agent 的 3 倍,而是 10 倍甚至更多。
四、修复方案:主管模式 + 共享状态 + 同步屏障
核心原则
多 Agent 系统的可靠性不来自“让 Agent 更聪明”,而来自用并发控制的思路设计协调层。ICML 论文的核心建议是:给多 Agent 系统引入一致性(Consistency)和隔离性(Isolation) 。
翻译成工程语言:不要让多个 Agent 自由读写共享状态,用主管统一管理状态,用同步屏障保证操作顺序。
修复一:主管模式——一个 Agent 管状态,其余 Agent 只管干活
不需要三个 Agent 都读写共享状态。让一个主管 Agent 持有唯一的数据源,其他 Agent 只负责执行,结果统一回传给主管。
import asyncio
class SupervisorAgent:
"""主管 Agent:持有唯一数据源,协调所有操作"""
def __init__(self):
self.order_state = None # 唯一数据源
async def query_order(self, order_id: str) –> dict:
"""查询订单,更新主管状态"""
await asyncio.sleep(0.1)
self.order_state = {
"order_id": order_id,
"status": "paid",
"amount": 99,
}
print(f"[主管] 订单状态已更新: {self.order_state['status']}")
return self.order_state
async def check_eligibility(self) –> bool:
"""基于主管持有的状态做判断"""
if self.order_state is None:
raise RuntimeError("必须先查询订单")
eligible = self.order_state["status"] == "paid"
print(f"[主管] 判断结果: {eligible}")
return eligible
async def execute_refund(self) –> str:
"""基于主管持有的状态执行"""
if self.order_state is None or self.order_state["status"] != "paid":
return "状态已变化,拒绝退款"
await asyncio.sleep(0.1)
return f"订单 {self.order_state['order_id']} 退款成功"
async def supervisor_flow(order_id: str) –> str:
supervisor = SupervisorAgent()
await supervisor.query_order(order_id)
if await supervisor.check_eligibility():
return await supervisor.execute_refund()
return "不符合退款条件"
asyncio.run(supervisor_flow("order-42"))
关键区别:所有决策基于同一个状态对象,不存在“判断 Agent 看到的状态”和“执行 Agent 看到的状态”不一致的问题。
修复二:同步屏障——在关键操作前强制所有 Agent “对齐”
对于必须并行执行的场景,引入同步屏障:在关键步骤前,所有 Agent 必须等待彼此到达同一点。
import asyncio
class SyncBarrier:
"""同步屏障:所有 Agent 必须等待彼此到达同一点"""
def __init__(self, num_agents: int):
self.num_agents = num_agents
self._count = 0
self._event = asyncio.Event()
self._lock = asyncio.Lock()
async def wait(self, agent_name: str):
async with self._lock:
self._count += 1
print(f"[屏障] {agent_name} 已到达 ({self._count}/{self.num_agents})")
if self._count == self.num_agents:
print("[屏障] 全部到达,释放")
self._event.set()
await self._event.wait()
async def parallel_agent(agent_name: str, barrier: SyncBarrier, work: callable):
# 阶段一:独立工作
result = await work()
print(f"[{agent_name}] 阶段一完成")
# 阶段二:等待所有 Agent 完成,再进入下一阶段
await barrier.wait(agent_name)
# 阶段三:基于同步后的状态继续
print(f"[{agent_name}] 进入阶段二")
async def main():
barrier = SyncBarrier(num_agents=3)
async def work_a():
await asyncio.sleep(0.1)
return "A"
async def work_b():
await asyncio.sleep(0.3)
return "B"
async def work_c():
await asyncio.sleep(0.2)
return "C"
await asyncio.gather(
parallel_agent("Agent-A", barrier, work_a),
parallel_agent("Agent-B", barrier, work_b),
parallel_agent("Agent-C", barrier, work_c),
)
asyncio.run(main())
应用场景:当多个 Agent 需要先各自收集信息,然后基于汇总后的完整信息一起做决策时,用同步屏障保证“所有人都基于同一份数据做决策”。
五、框架选择:选错了,还没写业务代码就多花 10 倍
截至 2026 年,四个框架主导了 Python 多 Agent 编排:Microsoft Agent Framework、LangGraph、AutoGen、CrewAI。它们不是“哪个好哪个坏”,而是适合不同协调模式。
| Microsoft Agent Framework | 数据流 + 类型化边 | 需要显式、可审计的执行路径 | 与 Azure 生态耦合 |
| LangGraph | 图状态机 | 复杂条件路由、需要精确控制 | 图编排引入协调延迟 |
| AutoGen | 群组对话(事件驱动) | 需要 Agent 间自由讨论 | Token 消耗中等,但可精细控制 |
| CrewAI | 角色 + 层级协调 | 任务分工明确的流水线 | Token 消耗是 AutoGen 的 10-20 倍 |
一句话建议:如果你刚入门多 Agent,从主管模式开始,不要一上来就用 CrewAI 的“团队自由讨论” 。Token 成本会让你在调试阶段就烧掉大量预算。
六、适用边界:什么时候不该用多 Agent
这篇文章不能只讲“怎么修”,还要讲清楚什么时候该放弃多 Agent。
| 单 Agent 准确率 > 45% | 不要拆。增加 Agent 大概率是负优化 |
| 任务涉及 16 种以上工具 | 不要拆。工具越多,Agent 越容易“死机” |
| 任务可以自然分解为完全独立的子任务 | 可以用并行编排 |
| 任务需要“草稿 → 审核 → 润色”的线性流程 | 可以用顺序编排 |
| 任务复杂,需要协调和审核 | 用主管编排 |
| 需要 3-4 个 Agent 协作 | 3-4 个是当前技术下的“黄金分割点” |
核心原则:
多 Agent 系统的可靠性不来自“让 Agent 更聪明”,而来自用并发控制的思路设计协调层。主管模式 + 共享状态 + 同步屏障,比“让三个 Agent 自由对话”可靠得多。
七、总结
Anthropic 的实验告诉我们一件反直觉的事:Agent 很少单独失败,但它们的交互会产生重复劳动、资源过载,甚至互相破坏。1600 条执行记录的分析把根因指向了同一个方向:系统设计,而不是模型能力。
如果你正在设计多 Agent 系统,先问自己三个问题:
初学者的三句话:
- 先把单 Agent 写好,把工具描述、循环控制、错误处理做扎实;
- 单 Agent 搞不定了,用主管模式起步,不要让 Agent“自由对话”;
- 多 Agent 的 Token 成本可能是指数级的,监控成本比监控延迟更重要。
参考资料:
- When AI agents coordinate without supervision, they turn on each other – Metorial
- Agents of Chaos: Real-world failure incidents from OpenClaw – arXiv
- Position: Multi-Agent Systems Should Prioritize Concurrency Control – ICML 2026
- Hidden Coordination Costs in Multi-Agent AI Systems – IEEE
- Compare orchestration frameworks – Microsoft Learn
- An Empirical Comparison of Agentic AI Frameworks – Zenodo
- 如果你正准备上多Agent系统,这篇文章能帮你省下至少50%的Token预算 – 腾讯云
#mermaid-svg-HdVFBGhe0RryZupT{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HdVFBGhe0RryZupT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HdVFBGhe0RryZupT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HdVFBGhe0RryZupT .error-icon{fill:#552222;}#mermaid-svg-HdVFBGhe0RryZupT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HdVFBGhe0RryZupT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HdVFBGhe0RryZupT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HdVFBGhe0RryZupT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HdVFBGhe0RryZupT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HdVFBGhe0RryZupT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HdVFBGhe0RryZupT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HdVFBGhe0RryZupT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HdVFBGhe0RryZupT .marker.cross{stroke:#333333;}#mermaid-svg-HdVFBGhe0RryZupT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HdVFBGhe0RryZupT p{margin:0;}#mermaid-svg-HdVFBGhe0RryZupT .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-HdVFBGhe0RryZupT .cluster-label text{fill:#333;}#mermaid-svg-HdVFBGhe0RryZupT .cluster-label span{color:#333;}#mermaid-svg-HdVFBGhe0RryZupT .cluster-label span p{background-color:transparent;}#mermaid-svg-HdVFBGhe0RryZupT .label text,#mermaid-svg-HdVFBGhe0RryZupT span{fill:#333;color:#333;}#mermaid-svg-HdVFBGhe0RryZupT .node rect,#mermaid-svg-HdVFBGhe0RryZupT .node circle,#mermaid-svg-HdVFBGhe0RryZupT .node ellipse,#mermaid-svg-HdVFBGhe0RryZupT .node polygon,#mermaid-svg-HdVFBGhe0RryZupT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HdVFBGhe0RryZupT .rough-node .label text,#mermaid-svg-HdVFBGhe0RryZupT .node .label text,#mermaid-svg-HdVFBGhe0RryZupT .image-shape .label,#mermaid-svg-HdVFBGhe0RryZupT .icon-shape .label{text-anchor:middle;}#mermaid-svg-HdVFBGhe0RryZupT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HdVFBGhe0RryZupT .rough-node .label,#mermaid-svg-HdVFBGhe0RryZupT .node .label,#mermaid-svg-HdVFBGhe0RryZupT .image-shape .label,#mermaid-svg-HdVFBGhe0RryZupT .icon-shape .label{text-align:center;}#mermaid-svg-HdVFBGhe0RryZupT .node.clickable{cursor:pointer;}#mermaid-svg-HdVFBGhe0RryZupT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HdVFBGhe0RryZupT .arrowheadPath{fill:#333333;}#mermaid-svg-HdVFBGhe0RryZupT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HdVFBGhe0RryZupT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HdVFBGhe0RryZupT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HdVFBGhe0RryZupT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HdVFBGhe0RryZupT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HdVFBGhe0RryZupT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HdVFBGhe0RryZupT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HdVFBGhe0RryZupT .cluster text{fill:#333;}#mermaid-svg-HdVFBGhe0RryZupT .cluster span{color:#333;}#mermaid-svg-HdVFBGhe0RryZupT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HdVFBGhe0RryZupT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HdVFBGhe0RryZupT rect.text{fill:none;stroke-width:0;}#mermaid-svg-HdVFBGhe0RryZupT .icon-shape,#mermaid-svg-HdVFBGhe0RryZupT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HdVFBGhe0RryZupT .icon-shape p,#mermaid-svg-HdVFBGhe0RryZupT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HdVFBGhe0RryZupT .icon-shape .label rect,#mermaid-svg-HdVFBGhe0RryZupT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HdVFBGhe0RryZupT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HdVFBGhe0RryZupT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HdVFBGhe0RryZupT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
30 个 Agent无监督共享环境
分支名碰撞18 个起同名
资源淹没240 万请求 / 117 岗位
互相破坏杀死进程 / 伪装代码
系统设计问题不是模型能力
主管模式 + 共享状态+ 同步屏障
网硕互联帮助中心





评论前必须登录!
注册