行與子Agent機(jī)制解析:線程池并發(fā)如何加速多工具調(diào)用)
【免費(fèi)下載鏈接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.項(xiàng)目地址https://gitcode.com/gh_mirrors/co/CoreCoder點(diǎn)擊查看免費(fèi)下載CoreCoder 是一個(gè)僅有約一千行 Python 代碼的最小 AI 編程智能體coding agent靈感來(lái)自 Claude Code可以連接任意 LLM 自主讀寫文件、執(zhí)行命令。當(dāng)你讓它看看這三個(gè)文件分別寫了啥時(shí)它很可能一口氣返回三個(gè)工具調(diào)用——如果逐個(gè)串行執(zhí)行就是干等而 CoreCoder 的解法正是本文的主角線程池并發(fā)加速多工具調(diào)用以及用**子Agentsub-agent**隔離重活。下面帶你讀懂這套機(jī)制的設(shè)計(jì)與取舍。背景模型為什么要一次要幾個(gè)工具CoreCoder 的核心是一個(gè)while循環(huán)把用戶的話交給模型 → 執(zhí)行它要求的工具 → 把結(jié)果塞回上下文 → 再問(wèn)直到模型不再要工具為止corecoder/agent.py。但模型并不總是一次只要一個(gè)工具。比如讓它對(duì)比三個(gè)配置文件它會(huì)同時(shí)發(fā)出三個(gè)read_file調(diào)用這三個(gè)讀操作彼此獨(dú)立串行跑就是白等。于是主循環(huán)里做了一個(gè)關(guān)鍵的分流if len(resp.tool_calls) 1: # 單個(gè)調(diào)用直接同步執(zhí)行 result self._exec_tool(tc) else: # 多個(gè)調(diào)用交給線程池并發(fā)跑 results self._exec_tools_parallel(resp.tool_calls, on_tool)單個(gè)調(diào)用走最簡(jiǎn)單的直跑路徑多個(gè)調(diào)用則進(jìn)入_exec_tools_parallelcorecoder/agent.py這是整個(gè)并行機(jī)制的心臟。線程池并發(fā)多工具調(diào)用如何同時(shí)跑核心實(shí)現(xiàn)只有寥寥數(shù)行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 個(gè)工作線程每個(gè)線程跑一個(gè)工具最后按原始順序收齊結(jié)果——順序一致性對(duì)模型很重要結(jié)果要能一一對(duì)應(yīng)回它的每個(gè)tool_call_id。? 為什么選線程池而不是多進(jìn)程或協(xié)程工具干的幾乎全是IO 密集的活讀盤、起子進(jìn)程、等網(wǎng)絡(luò)。這種場(chǎng)景下 Python 的 GIL 基本不礙事線程就能跑滿帶寬。ThreadPoolExecutor是標(biāo)準(zhǔn)庫(kù)里最省事的并發(fā)原語(yǔ)幾行搞定符合項(xiàng)目能簡(jiǎn)則簡(jiǎn)的基調(diào)。三個(gè)文件讀取本來(lái)要等三趟 IO現(xiàn)在大致只等最慢的那一趟。并行不是免費(fèi)的共享可變狀態(tài)會(huì)咬人并發(fā)最容易出事的地方是多個(gè)任務(wù)共享同一份可變狀態(tài)。CoreCoder 里有兩處教科書級(jí)的防護(hù)。 bash 的 cd 追蹤與線程本地存儲(chǔ)bash 工具需要在多條命令之間記住cd去了哪里corecoder/tools/bash.py。最直覺(jué)的存法是一個(gè)模塊級(jí)全局變量串行時(shí)毫無(wú)問(wèn)題可一旦兩個(gè) bash 調(diào)用在不同線程里同時(shí)讀寫它一個(gè)剛改成目錄 A另一個(gè)可能正好讀到 A 或覆蓋成 B——典型的競(jìng)態(tài)平時(shí)跑一萬(wàn)次都對(duì)偏偏并發(fā)時(shí)給你個(gè)莫名其妙還難復(fù)現(xiàn)的錯(cuò)。干凈的解法是用threading.local()把狀態(tài)隔離到每個(gè)線程_local threading.local() def get_tracked_cwd(): 取當(dāng)前線程自己追蹤的 cwd return getattr(_local, cwd, None)此外工作線程啟動(dòng)時(shí)會(huì)繼承會(huì)話級(jí) cwd批次結(jié)束后再把各線程里的cd按調(diào)用順序合并回來(lái)讓并行的一批 bash對(duì)外表現(xiàn)得像串行的一串 bash。相關(guān)行為由 tests/test_core.py 中的并行測(cè)試守護(hù)。 文件寫入的串行鎖并行的另一顆暗雷兩個(gè)edit_file同時(shí)改一個(gè)文件讀-改-寫交錯(cuò)就會(huì)丟編輯。CoreCoder 在工具基類里放了一把全局鎖corecoder/tools/base.pyFILE_MUTATION_LOCK threading.Lock()edit_file/write_file執(zhí)行時(shí)都先拿到這把鎖保證同一批并發(fā)里的寫操作串行落地——兩條編輯都不會(huì)丟。讀類工具則無(wú)需加鎖放心并發(fā)。 這是加并行前必問(wèn)的一課你的工具扛得住被兩個(gè)線程同時(shí)調(diào)用嗎給 agent 加并行等于給所有帶可變狀態(tài)的工具加了一道并發(fā)正確性要求。權(quán)限確認(rèn)與 Hooks 的前置結(jié)算并行還有一個(gè)人機(jī)交互細(xì)節(jié)改文件的工具edit_file、bash、派生子Agent執(zhí)行前要經(jīng)過(guò)用戶確認(rèn)而且 PreToolUse/PostToolUse hooks 也會(huì)圍繞每次調(diào)用觸發(fā)。如果讓 8 個(gè)線程各自彈確認(rèn)框終端上會(huì)同時(shí)冒出好幾個(gè) prompt誰(shuí)也看不清。CoreCoder 的做法是hooks 和權(quán)限判定全部在主線程先行結(jié)算完只有放行或拒絕的調(diào)用才會(huì)提交進(jìn)線程池。被拒絕的調(diào)用不會(huì)執(zhí)行其拒絕理由直接作為普通工具結(jié)果返回給模型主循環(huán)因此永遠(yuǎn)不會(huì)卡死在等輸入上。另外即使你在并行批次執(zhí)行中途按下 CtrlC主循環(huán)也會(huì)給每個(gè)還沒(méi)回音的tool_calls補(bǔ)一條占位回復(fù)見 corecoder/agent.py保證歷史消息始終合法下一輪請(qǐng)求不會(huì)被孤兒消息污染。子Agent機(jī)制給主Agent開一個(gè)分身如果說(shuō)線程池解決的是一次多干幾件小事那么agent工具corecoder/tools/agent.py72 行解決的是一件很重的活。獨(dú)立上下文把噪音擋在主對(duì)話之外想象你讓主 agent把這個(gè)陌生代碼庫(kù)摸一遍告訴我認(rèn)證是怎么實(shí)現(xiàn)的。它要讀一堆文件、跑一堆搜索這些中間過(guò)程全堆進(jìn)主對(duì)話窗口等摸清楚了窗口也塞滿了探索垃圾真正的任務(wù)反而沒(méi)空間了。子Agent的思路派一個(gè)有獨(dú)立上下文的分身去干重活它在自己的窗口里折騰干完只交回一句精簡(jiǎn)結(jié)論sub Agent( llmparent.llm, # 復(fù)用同一個(gè)模型連接費(fèi)用并入主會(huì)話 tools[t for t in parent.tools if t.name ! agent], # 禁遞歸 max_rounds20, # 輪次上限比主 agent 更緊 ) result sub.chat(task)幾個(gè)關(guān)鍵的約束設(shè)計(jì)上下文隔離子Agent擁有全新的messages列表主窗口始終干凈輸出截?cái)嘟Y(jié)論超過(guò) 5000 字符時(shí)截到 4500免得省下的空間又被超長(zhǎng)報(bào)告吐回去失敗不外溢子Agent拋異常只會(huì)變成一段文字結(jié)果不會(huì)擊穿父循環(huán)狀態(tài)不泄漏子Agent自己cd過(guò)的目錄會(huì)在返回時(shí)恢復(fù)不會(huì)污染父會(huì)話的 shell 狀態(tài)。禁止遞歸分身只能有一層上面那行# no recursive agents是這段代碼里最重要的一句。派生子Agent時(shí)工具集被刻意過(guò)濾掉agent本身——子Agent手里沒(méi)有開分身的能力它干不了的事只能自己硬扛。為什么一刀切因?yàn)檫f歸 Agent 是一顆隨時(shí)失控的炸彈主派子、子派孫……每一層都在燒 token、占線程、加延遲而模型對(duì)該不該再拆的判斷并不可靠完全可能陷進(jìn)越拆越細(xì)、永遠(yuǎn)收不攏的無(wú)底洞。禁掉遞歸要么子Agent自己搞定要么失敗返回沒(méi)有第三種走向。很多人以為子Agent是為了并行干更多活其實(shí)它最大的價(jià)值是上下文管理把別的活的噪音擋在主對(duì)話之外其次才是任務(wù)分解??焖偕鲜峙芷饋?lái)看看想親手體驗(yàn)五分鐘就能跑起來(lái)git clone https://gitcode.com/gh_mirrors/co/CoreCoder cd CoreCoder pip install -e .配上OPENAI_API_KEY或 DeepSeek、本地 Ollama 等兩個(gè)環(huán)境變量然后corecoder -p 看看這三個(gè)文件分別寫了什么a.py b.py c.py注意觀察三個(gè)獨(dú)立的read_file調(diào)用會(huì)幾乎同時(shí)出現(xiàn)在終端里——那就是線程池在并發(fā)工作??偨Y(jié)從這兩行設(shè)計(jì)看懂并發(fā)工程機(jī)制一句話關(guān)鍵文件線程池并發(fā)多個(gè)獨(dú)立工具調(diào)用同時(shí)跑IO 密集場(chǎng)景幾行代碼搞定agent.py線程本地 cwd用threading.local消滅競(jìng)態(tài)tools/bash.py文件寫入鎖并發(fā)批次里寫操作串行落地tools/base.py前置結(jié)算權(quán)限與 hooks 在主線程完成避免多 prompt 混排agent.py子Agent獨(dú)立上下文 禁遞歸 輸出截?cái)鄑ools/agent.py模型一次返回多個(gè)獨(dú)立工具調(diào)用時(shí)線程池并發(fā)是筆劃算的買賣IO 密集場(chǎng)景下它是最省事的并發(fā)原語(yǔ)并行不是免費(fèi)的它給每個(gè)帶可變狀態(tài)的工具都加了一道并發(fā)正確性要求加并行前先問(wèn)自己扛不扛得住被同時(shí)調(diào)用子Agent首先是上下文管理手段其次才是任務(wù)分解手段禁止遞歸是用一刀切換絕不失控。更多細(xì)節(jié)項(xiàng)目里自帶的雙語(yǔ)源碼解讀系列第五篇article/05-parallel-and-subagents.md逐行拆解了這兩塊機(jī)制值得一讀。贊分享【免費(fèi)下載鏈接】CoreCoderMinimal AI coding agent (~1,000 lines of Python) inspired by Claude Code. Works with any LLM. Think NanoGPT for coding agents. Formerly NanoCoder.項(xiàng)目地址https://gitcode.com/gh_mirrors/co/CoreCoder點(diǎn)擊查看免費(fèi)下載相關(guān)推薦DuckDB并行查詢執(zhí)行多線程如何加速?gòu)?fù)雜分析任務(wù)DuckDB并行查詢執(zhí)行多線程如何加速?gòu)?fù)雜分析任務(wù) 你是否經(jīng)常遇到數(shù)據(jù)分析任務(wù)耗時(shí)過(guò)長(zhǎng)的問(wèn)題當(dāng)處理百萬(wàn)甚至上億行數(shù)據(jù)時(shí)單線程執(zhí)行往往需要等待數(shù)分鐘甚至更長(zhǎng)數(shù)據(jù)庫(kù)OLAP嵌入式數(shù)據(jù)庫(kù)數(shù)據(jù)分析Forge Task 工具深度解析多 Agent 并行委派、子代理執(zhí)行與會(huì)話恢復(fù)機(jī)制Forge Task 工具深度解析多 Agent 并行委派、子代理執(zhí)行與會(huì)話恢復(fù)機(jī)制 導(dǎo)讀 Forge 的 task 工具是面向復(fù)雜多步任務(wù)設(shè)計(jì)的代理型工具人工智能AI Agent代碼智能體AI 應(yīng)用CLI開發(fā)工具Anomalib 管道并行執(zhí)行ParallelRunner 進(jìn)程池機(jī)制與多 GPU 任務(wù)調(diào)度實(shí)踐Anomalib 管道并行執(zhí)行ParallelRunner 進(jìn)程池機(jī)制與多 GPU 任務(wù)調(diào)度實(shí)踐 本篇指南聚焦 Anomalib 管道pipeline框架人工智能計(jì)算機(jī)視覺(jué)深度學(xué)習(xí)模型評(píng)測(cè)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考