当前位置: 首页 > article >正文

# 让工具自己声明并发安全:我把调度逻辑砍到一行

让工具自己声明并发安全我把调度逻辑砍到一行这是 《写完一个 AI 编程助手之后我才确定 prompt 工程不是重点》 的第四篇。前几篇讲了进程模型和权限系统这一篇讲并发调度。代码[https://github.com/sishenaichipingguo/code-agent)。AI 经常一口气甩三个工具[ { name: read, input: { path: a.ts } }, { name: read, input: { path: b.ts } }, { name: grep, input: { pattern: TODO } } ]也经常这样[ { name: read, input: { path: a.ts } }, { name: write, input: { path: a.ts, content: ... } }, { name: edit, input: { path: a.ts, ... } } ]第一组并行跑没问题。第二组并行跑就炸——同一个文件被三个操作竞争。调度器要不要并行怎么决定我试过三种方案前两种都错了。一、第一种错法全部串行最朴素的方案永远不并行。for(consttooloftools){results.push(awaitrunTool(tool))}正确但慢得令人发指。读三个文件本来 50ms 能搞定串行变成 150ms。一次轮次里有四五次 batch累积下来用户能感觉到。而且这是个无意义的慢——Read 工具就是无害的串它干嘛二、第二种错法调度器去猜第二个直觉是写一张表constSAFE_TOOLS[read,grep,glob,ls]constallSafetools.every(tSAFE_TOOLS.includes(t.name))跑了几天就发现 bug。比如bash git status ← 只读应该并行 bash rm -rf foo ← 破坏性绝对不能并行是同一个工具bash但语义完全不同。把bash加进 SAFE 列表是错的不加进去又把所有bash git status / git log / ls这种纯查询全串行了。更糟的是每加一个新工具就要回到调度器更新这张表。写新工具的人必须改无关的代码——每次都会忘。调度器不应该知道工具的语义。任何让调度器去判断工具的方案都会在加新工具时退化。三、第三种做法让工具自己说核心改动在每个工具上加一个方法。// src/core/permissions/types.tsexportinterfacePermissionCapable{isConcurrencySafe(input:unknown):boolean// ...}然后调度器只问一句话// src/core/agent/loop.tsconstallConcurrencySafetools.every(t{consttoolthis.context.tools.get(t.name)returntool?.isConcurrencySafe(t.input)??false})if(allConcurrencySafe){returnPromise.all(tools.map(runTool))}constresults:any[][]for(consttooloftools){results.push(awaitrunTool(tool))}returnresults调度器一行判断。工具自己回答// read.tsisConcurrencySafe:()true,// write.ts、edit.ts、rm.tsisConcurrencySafe:()false,bash是真正有意思的那个// src/core/tools/bash.tsisConcurrencySafe:(input){constcmd(inputasany).commandreturntypeofcmdstringclassifyCommand(cmd)readonly}注意签名——isConcurrencySafe(input)接收输入。同一个bash工具对git status返回true对rm -rf返回false。判断粒度不是工具是工具调用。这是这个设计真正起作用的地方。如果签名是isConcurrencySafe()无参数bash 就只能选一个保守的false损失全部并发收益。四、默认值要保守不要乐观有一个细节决定这套设计能不能在团队里活下来默认值。createTool的默认实现// src/core/tools/registry.tsisConcurrencySafe:spec.isConcurrencySafe??(()false)默认false。新写的工具如果忘了声明自动按串行处理。忘记声明的代价是慢不是炸。反过来如果默认true每加一个新工具都可能引入并发 bug而且测试很难发现——因为冲突只在特定时序下出现。MCP 工具也走这个默认src/core/mcp/client/tool-wrapper.tsisConcurrencySafe:()false这是对的因为 MCP server 的语义对我们完全不透明假设它危险是唯一安全的选择。任何必须由作者主动声明才安全的属性默认值都要选不安全的那一边。五、为什么不做部分并行最后一个反直觉的决定不要做部分并行。设想这个 batch[ read a.ts, read b.ts, write c.ts, read d.ts ]聪明的调度器会说“前两个并行等第三个串行执行再起一个并行跑第四个。”这套逻辑要写一个拓扑排序要追踪资源依赖哪些路径在被写bash 的副作用怎么算还要考虑回退。代码量从 5 行膨胀到 200 行且每个新工具都要重新审视。我选择了最钝的方案全部安全 → Promise.all 否则 → 全部串行代价是上面那个 batch 退化成全串行慢一点。但代码简单到不会出 bug新工具加进来零成本。能用 5 行代码解决 80% 的问题时不要写 200 行代码解决 100% 的问题。实际跑下来AI 给的 batch 里 95% 要么全是 read 类全并行要么含 write/edit全串行。混合 batch 罕见性价比不值得为它写复杂逻辑。所以呢这是「工程问题决定 Agent 好坏」系列的第三个例子跟前两篇讲的是同一个原则进程模型把阻塞操作丢给 Worker主循环只负责调度权限系统把危险性判断丢给工具引擎只负责仲裁工具调度这篇把并发安全丢给工具调度器只负责选Promise.all或串行框架的本职工作只有一件定义一个让组件自我描述的接口然后做最钝的调度。写得越多 AI Agent 我越确信这件事。prompt 工程、chain 抽象、memory 设计这些被各种框架包装的概念本质上都是组件自我描述 钝调度的问题。一旦你把它从框架的智能改成组件的诚实复杂度立刻塌一个数量级。代码github.com/your-handle/code-agent。下一篇讲 Agent 长对话的核心问题上下文窗口快满了怎么办——三种压缩策略和一个自动兜底机制。

相关文章:

# 让工具自己声明并发安全:我把调度逻辑砍到一行

让工具自己声明并发安全:我把调度逻辑砍到一行 这是 《写完一个 AI 编程助手之后,我才确定 prompt 工程不是重点》 的第四篇。前几篇讲了进程模型和权限系统,这一篇讲并发调度。 代码:[https://github.com/sishenaichipingguo/cod…...

2026 运营实战:AI 电商生图能快速上手的工具深度测评,哪款是你的大促生产力?

随着 618 电商节 大促之战打响,电商圈可以说是全行业交付压力最高的地方。尤其是现在的跨平台视觉竞争,不仅对视觉的高级感和 3D 渲染有要求,更看重一个字——快。如果一个爆款链接需要快速延展出厨房电器、宠物用品等不同类目的几百张不同尺…...

CANN ops-transformer 的 FlashAttention:把大模型的记忆从 32GB 压到 8GB,怎么做到的

刚接触昇腾CANN那会,我以为 ops-transformer 就是个普通的算子仓库,和 ops-math、ops-nn 没什么区别。后来跑一个 70B 模型的推理任务,显存直接爆了,才发现大模型的注意力计算才是真正的吞显存怪兽——而 ops-transformer 里那个 …...

Seedance2.0内容创作干货!学会这四点教你用 Seedance 2.0 拍出电影感!

Seedance 2.0 之所以能把商业广告、影视制作的质感拉满,核心在于它对“全参调用”的支持。想彻底驯服它,建议你在输入 Prompt 和参数时注意以下四点:1. 结构化你的提示词不要把所有想法堆砌成一句话。Seedance 2.0 对结构化文本的理解极强&am…...

哨兵1号数据处理必备:如何搞定精密轨道文件和SRTM DEM数据(最新可用链接)

哨兵1号数据处理实战:精密轨道与SRTM DEM数据获取全指南 对于从事InSAR或时序分析的遥感研究者而言,数据预处理阶段的轨道校正和地形相位去除是决定成果精度的关键步骤。本文将聚焦哨兵1号SAR数据处理中最核心的两类辅助数据——精密轨道文件和SRTM DEM&…...

WPF 打造可视化标签打印工具:自由绘制,所见即所得

前言在仓储物流、生产制造、零售门店等场景中,标签打印是日常操作中不可或缺的一环。然而,传统的标签打印往往依赖固定的模板或复杂的脚本配置,一旦需要调整内容布局,就得修改代码甚至重新部署系统。本文推荐一款可视化标签打印工…...

别再搜组策略了!Windows 11家庭版设置密码永不过期的3个命令行方法(实测有效)

Windows 11家庭版密码永不过期终极指南:抛弃组策略的3种命令行方案 每次开机都要重新设置密码?Windows 11家庭版用户常常陷入这种困扰。与专业版不同,家庭版系统阉割了组策略编辑器这个关键工具,让普通用户面对密码过期问题时束手…...

这个AI助手不让你教它,它自己来了解你

这个AI助手不让你教它,它自己来了解你OpenHuman:9700 Star,GitHub霸榜的秘密最近GitHub Trending上冒出来一个项目,连续霸榜多天,Star数蹭蹭往上涨。我点进去看了一眼,思路跟之前那些Agent工具完全不一样。…...

缙云定制木门,别只看报价,多花3000块买了教训

去年帮朋友盯装修,他图便宜选了某门店的“特价木门”,结果装上才半年,门框受潮变形、关门嘎吱响,隔音差到客厅看电视卧室听得一清二楚。最后拆掉重做,多花了3000块冤枉钱。缙云本地业主装木门,千万别踩这个…...

负载型聚丙烯酰胺PAM水凝胶:构筑多功能智能材料的新范式

名称:负载型聚丙烯酰胺(PAM)水凝胶 负载型聚丙烯酰胺(PAM)水凝胶作为一种先进的功能高分子材料,正以其独特的网络结构和可调控的物理化学性质,在环境治理、生物医药及智能传感等领域展现出巨大的…...

8351健康管理中心用黑科技设备为企业家筑起生命防线

事业的成功固然值得骄傲,但如果没有健康作为根基,一切的辉煌都显得摇摇欲坠。对于每天在高压下决策、在商海中搏击的企业家而言,健康早已不是一句简单的口号,而是一场需要长期投入的战略投资。然而现实往往是,很多企业…...

负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,ZnPc/α-Naphthol

名称:负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,ZnPc/α-Naphthol 一、材料概览:双重功能的精妙融合 负载锌酞菁(ZnPc)/α-萘酚温敏水凝胶,是将具有优异光催化活性的锌酞菁(Zn…...

好书推荐《VirtualLab Fusion入门与进阶实用教程(第二版)》

目 录第一章 VirtualLab Fusion理论基础 1 1.1 几何光学和光线追迹 1 1.2 物理光学和光场追迹 1 1.2.1 统一场追迹 3 1.2.2 第二代场追迹 6 第二章 VirtualLab Fusion安装与更新 10 2.1 VirtualLab 版本说明及系统配置要求 10 2.2 VirtualLab安装与更新 11 2.3 安装过程中可能遇…...

聚焦新型有效成分,守护爱宠健康

养宠过程中,用药安全是守护宠物健康的核心关键。多数养宠人选药时,常只关注品牌、价格或口碑,却忽略了药物有效成分这一核心根本。随着宠物医药技术迭代升级,多款新型专用药用成分落地应用,凭借精准、安全、低耐药的优…...

python学习笔记 | 11.2、面向对象高级编程-使用@property

一、先搞懂:我们为什么要用 property? 1. 原始问题 直接给对象赋值,没法检查数据是否合法: class Student:passs Student() s.score 9999 # 成绩不可能是9999,完全不合理!2. 笨办法解决(太麻…...

别再手动整理文献了!用Python+Semantic Scholar API,5分钟搞定论文参考文献批量导出

科研效率革命:用PythonSemantic Scholar批量导出参考文献的完整方案 深夜的实验室里,咖啡杯已经见底,而你的文献综述才完成不到三分之一。面对散落在各处的参考文献格式,手动整理的时间远超阅读时间——这是大多数科研工作者的真…...

告别混乱!在C#/C++混合项目中用OpenCasCade 7.7.0搞定三维坐标显示(附完整代码)

工业级三维坐标可视化实战:OpenCasCade混合开发深度解析 第一次在CAD软件中看到那个小小的三色坐标轴时,我完全没意识到它背后隐藏着如此复杂的工程逻辑。直到自己动手在C#/C混合环境中实现OpenCasCade的坐标显示系统,才真正理解工业级三维可…...

推荐1款全能跨平台下载工具,免费、开源、无广告!

聊一聊下载一直是热话题。特别是遇到自己喜欢的。如电影、电视剧、音乐等等。但并不是所有下载工具都能实现。今天给大家分享一款好用的下载利器。软件介绍全能开源跨平台下载工具Motrix工具只有自己用了才知道好不好用。这是一款无需安装,下载解压即可使用的工具。…...

Flutter代码混淆实战指南:原理、配置与常见问题解决方案

1. 项目概述:为什么Flutter代码混淆是开发者的必修课?在Flutter应用开发中,我们常常将精力倾注于UI的丝滑流畅、功能的丰富强大,却容易忽视一个至关重要的环节——代码安全。当你的应用发布到各大应用商店,那些辛苦编写…...

手把手教你复现CVE-2022-25578:利用.htaccess文件上传绕过,在Taocms 3.0.2靶场拿Flag

从零实战复现CVE-2022-25578:Taocms 3.0.2靶场渗透全解析 在网络安全领域,文件上传漏洞一直是渗透测试中的经典突破口。今天我们将深入剖析CVE-2022-25578漏洞,这是一个基于.htaccess文件配置不当导致的安全问题。不同于简单的漏洞复现教程&a…...

深度观察:从静态路牌到智能交互,城市导视系统的三次进化

当我们谈论智慧城市时,往往会聚焦于自动驾驶、智慧安防、数字政务这些宏大的叙事,却常常忽略了一个最贴近普通人生活的基础设施 —— 导视系统。作为城市空间的 "无声语言",导视系统连接着人与空间,影响着每一个人的出行…...

告别外挂SDRAM!用SWM34SRET6这颗内置8MB内存的MCU驱动4.3寸屏,成本直降

告别外挂SDRAM!用SWM34SRET6这颗内置8MB内存的MCU驱动4.3寸屏,成本直降 在嵌入式显示项目中,驱动TFT-LCD屏幕往往需要搭配外置SDRAM芯片来满足帧缓冲需求。这不仅增加了BOM成本,还占用了宝贵的PCB面积,更让布线复杂度直…...

外部系统调用SAP数据?用ABAP RFC函数搭个“桥梁”其实很简单(含Function Group创建避坑)

跨系统数据整合:ABAP RFC函数的设计哲学与实战指南 当企业数字化转型进入深水区,业务系统间的数据孤岛问题日益凸显。某零售企业的供应链总监最近就面临这样的挑战:"我们的电商平台需要实时获取SAP中的库存数据,但每次手工导…...

学习刷题公众号管理系统

功能特点支持视频、音频、图文三种课程形式,按知识点分类管理,支持自由添加和编辑课程章节。课程可设置为免费或付费模式,支持VIP会员免费学习权限设置。提供智能组卷功能,学员可按知识点自主组卷,系统从题库中随机抽题…...

喜马拉雅音频下载器:三分钟学会下载付费专辑的完整方案

喜马拉雅音频下载器:三分钟学会下载付费专辑的完整方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否遇到过这…...

多场景互动抽奖公众号管理系统

快微摇一摇周边模块详解适配平台与交付方式 基于微擎系统开发,专为微信公众号设计,兼容认证服务号和订阅号(订阅号需借用权限)。通过微擎系统在线安装交付,无需额外技术部署。核心功能亮点 多主题模板支持普通摇一摇、…...

AR 巡检:6 大黄金行业与厂商推荐

AR 巡检是将增强现实技术与工业巡检流程深度融合的智能运维方案,核心作用是通过虚实叠加实现设备状态可视化、巡检流程标准化与故障诊断智能化。传统巡检依赖纸质记录、人工记忆和经验判断,存在漏检误检率高、数据无法实时同步、故障排查周期长等问题&am…...

多版面文章活动公众号管理系统

文章营销活动系统概述基于微擎系统开发的在线交付文章营销推广类源码应用,支持多活动管理、多站点搭建及多版面切换。核心功能包括转发奖励积分或余额,适配文章推广、流量裂变及营销获客需求。核心功能多活动管理 后台可创建并管理多个营销活动&#xff…...

终极Matlab深度学习工具箱:DeepLearnToolbox完整指南

终极Matlab深度学习工具箱:DeepLearnToolbox完整指南 【免费下载链接】DeepLearnToolbox Matlab/Octave toolbox for deep learning. Includes Deep Belief Nets, Stacked Autoencoders, Convolutional Neural Nets, Convolutional Autoencoders and vanilla Neural…...

JeecgBoot 低代码平台:协同工作与 Flowable 流程审批,如何选?

JeecgBoot 低代码平台两模块引困惑很多团队在接入 JeecgBoot 低代码平台后,面对 "协同工作" 和 "Flowable 流程审批" 两个模块时常常陷入困惑:两个都是处理审批流程的,到底用哪个?能混着用吗?设计…...