ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CoreCoder并行执行与子Agent机制解析:线程池并发如何加速多工具调用

CoreCoder并行执行与子Agent机制解析:线程池并发如何加速多工具调用 【免费下载链接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.项目地址https://gitcode.com/gh_mirrors/co/CoreCoder点击查看免费下载CoreCoder 是一个仅有约一千行 Python 代码的最小 AI 编程智能体coding agent灵感来自 Claude Code可以连接任意 LLM 自主读写文件、执行命令。当你让它看看这三个文件分别写了啥时它很可能一口气返回三个工具调用——如果逐个串行执行就是干等而 CoreCoder 的解法正是本文的主角线程池并发加速多工具调用以及用**子Agentsub-agent**隔离重活。下面带你读懂这套机制的设计与取舍。背景模型为什么要一次要几个工具CoreCoder 的核心是一个while循环把用户的话交给模型 → 执行它要求的工具 → 把结果塞回上下文 → 再问直到模型不再要工具为止corecoder/agent.py。但模型并不总是一次只要一个工具。比如让它对比三个配置文件它会同时发出三个read_file调用这三个读操作彼此独立串行跑就是白等。于是主循环里做了一个关键的分流if len(resp.tool_calls) 1: # 单个调用直接同步执行 result self._exec_tool(tc) else: # 多个调用交给线程池并发跑 results self._exec_tools_parallel(resp.tool_calls, on_tool)单个调用走最简单的直跑路径多个调用则进入_exec_tools_parallelcorecoder/agent.py这是整个并行机制的心脏。线程池并发多工具调用如何同时跑核心实现只有寥寥数行with concurrent.futures.ThreadPoolExecutor(max_workers8) as pool: futures {i: pool.submit(run, i, tc, session_cwd) for i, tc in enumerate(tool_calls)} for i, future in futures.items(): i, results[i], worker_cwd future.result()最多 8 个工作线程每个线程跑一个工具最后按原始顺序收齐结果——顺序一致性对模型很重要结果要能一一对应回它的每个tool_call_id。⚡ 为什么选线程池而不是多进程或协程工具干的几乎全是IO 密集的活读盘、起子进程、等网络。这种场景下 Python 的 GIL 基本不碍事线程就能跑满带宽。ThreadPoolExecutor是标准库里最省事的并发原语几行搞定符合项目能简则简的基调。三个文件读取本来要等三趟 IO现在大致只等最慢的那一趟。并行不是免费的共享可变状态会咬人并发最容易出事的地方是多个任务共享同一份可变状态。CoreCoder 里有两处教科书级的防护。 bash 的 cd 追踪与线程本地存储bash 工具需要在多条命令之间记住cd去了哪里corecoder/tools/bash.py。最直觉的存法是一个模块级全局变量串行时毫无问题可一旦两个 bash 调用在不同线程里同时读写它一个刚改成目录 A另一个可能正好读到 A 或覆盖成 B——典型的竞态平时跑一万次都对偏偏并发时给你个莫名其妙还难复现的错。干净的解法是用threading.local()把状态隔离到每个线程_local threading.local() def get_tracked_cwd(): 取当前线程自己追踪的 cwd return getattr(_local, cwd, None)此外工作线程启动时会继承会话级 cwd批次结束后再把各线程里的cd按调用顺序合并回来让并行的一批 bash对外表现得像串行的一串 bash。相关行为由 tests/test_core.py 中的并行测试守护。 文件写入的串行锁并行的另一颗暗雷两个edit_file同时改一个文件读-改-写交错就会丢编辑。CoreCoder 在工具基类里放了一把全局锁corecoder/tools/base.pyFILE_MUTATION_LOCK threading.Lock()edit_file/write_file执行时都先拿到这把锁保证同一批并发里的写操作串行落地——两条编辑都不会丢。读类工具则无需加锁放心并发。 这是加并行前必问的一课你的工具扛得住被两个线程同时调用吗给 agent 加并行等于给所有带可变状态的工具加了一道并发正确性要求。权限确认与 Hooks 的前置结算并行还有一个人机交互细节改文件的工具edit_file、bash、派生子Agent执行前要经过用户确认而且 PreToolUse/PostToolUse hooks 也会围绕每次调用触发。如果让 8 个线程各自弹确认框终端上会同时冒出好几个 prompt谁也看不清。CoreCoder 的做法是hooks 和权限判定全部在主线程先行结算完只有放行或拒绝的调用才会提交进线程池。被拒绝的调用不会执行其拒绝理由直接作为普通工具结果返回给模型主循环因此永远不会卡死在等输入上。另外即使你在并行批次执行中途按下 CtrlC主循环也会给每个还没回音的tool_calls补一条占位回复见 corecoder/agent.py保证历史消息始终合法下一轮请求不会被孤儿消息污染。子Agent机制给主Agent开一个分身如果说线程池解决的是一次多干几件小事那么agent工具corecoder/tools/agent.py72 行解决的是一件很重的活。独立上下文把噪音挡在主对话之外想象你让主 agent把这个陌生代码库摸一遍告诉我认证是怎么实现的。它要读一堆文件、跑一堆搜索这些中间过程全堆进主对话窗口等摸清楚了窗口也塞满了探索垃圾真正的任务反而没空间了。子Agent的思路派一个有独立上下文的分身去干重活它在自己的窗口里折腾干完只交回一句精简结论sub Agent( llmparent.llm, # 复用同一个模型连接费用并入主会话 tools[t for t in parent.tools if t.name ! agent], # 禁递归 max_rounds20, # 轮次上限比主 agent 更紧 ) result sub.chat(task)几个关键的约束设计上下文隔离子Agent拥有全新的messages列表主窗口始终干净输出截断结论超过 5000 字符时截到 4500免得省下的空间又被超长报告吐回去失败不外溢子Agent抛异常只会变成一段文字结果不会击穿父循环状态不泄漏子Agent自己cd过的目录会在返回时恢复不会污染父会话的 shell 状态。禁止递归分身只能有一层上面那行# no recursive agents是这段代码里最重要的一句。派生子Agent时工具集被刻意过滤掉agent本身——子Agent手里没有开分身的能力它干不了的事只能自己硬扛。为什么一刀切因为递归 Agent 是一颗随时失控的炸弹主派子、子派孙……每一层都在烧 token、占线程、加延迟而模型对该不该再拆的判断并不可靠完全可能陷进越拆越细、永远收不拢的无底洞。禁掉递归要么子Agent自己搞定要么失败返回没有第三种走向。很多人以为子Agent是为了并行干更多活其实它最大的价值是上下文管理把别的活的噪音挡在主对话之外其次才是任务分解。快速上手跑起来看看想亲手体验五分钟就能跑起来git clone https://gitcode.com/gh_mirrors/co/CoreCoder cd CoreCoder pip install -e .配上OPENAI_API_KEY或 DeepSeek、本地 Ollama 等两个环境变量然后corecoder -p 看看这三个文件分别写了什么a.py b.py c.py注意观察三个独立的read_file调用会几乎同时出现在终端里——那就是线程池在并发工作。总结从这两行设计看懂并发工程机制一句话关键文件线程池并发多个独立工具调用同时跑IO 密集场景几行代码搞定agent.py线程本地 cwd用threading.local消灭竞态tools/bash.py文件写入锁并发批次里写操作串行落地tools/base.py前置结算权限与 hooks 在主线程完成避免多 prompt 混排agent.py子Agent独立上下文 禁递归 输出截断tools/agent.py模型一次返回多个独立工具调用时线程池并发是笔划算的买卖IO 密集场景下它是最省事的并发原语并行不是免费的它给每个带可变状态的工具都加了一道并发正确性要求加并行前先问自己扛不扛得住被同时调用子Agent首先是上下文管理手段其次才是任务分解手段禁止递归是用一刀切换绝不失控。更多细节项目里自带的双语源码解读系列第五篇article/05-parallel-and-subagents.md逐行拆解了这两块机制值得一读。赞分享【免费下载链接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.项目地址https://gitcode.com/gh_mirrors/co/CoreCoder点击查看免费下载相关推荐DuckDB并行查询执行多线程如何加速复杂分析任务DuckDB并行查询执行多线程如何加速复杂分析任务 你是否经常遇到数据分析任务耗时过长的问题当处理百万甚至上亿行数据时单线程执行往往需要等待数分钟甚至更长数据库OLAP嵌入式数据库数据分析Forge Task 工具深度解析多 Agent 并行委派、子代理执行与会话恢复机制Forge Task 工具深度解析多 Agent 并行委派、子代理执行与会话恢复机制 导读 Forge 的 task 工具是面向复杂多步任务设计的代理型工具人工智能AI Agent代码智能体AI 应用CLI开发工具Anomalib 管道并行执行ParallelRunner 进程池机制与多 GPU 任务调度实践Anomalib 管道并行执行ParallelRunner 进程池机制与多 GPU 任务调度实践 本篇指南聚焦 Anomalib 管道pipeline框架人工智能计算机视觉深度学习模型评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进