parallel 与 pipeline:并行的两种玩法
上一篇用了 parallel,这篇讲清楚它和 pipeline 的区别。这俩是 Workflow 里最容易搞混的。
一句话:parallel 等人,pipeline 不等人。
一、parallel:等所有人到齐
scss
const [chinese, english, github] = await parallel([
() => agent('搜中文资料'),
() => agent('搜英文资料'),
() => agent('搜开源项目'),
])
三个 Agent 同时启动,但 parallel 会等最慢的那个回来,才把三个结果一起给你。先回来的干等着。
就像约三个人开会,两个人提前到了,也得等最后那个迟到的。
二、pipeline:各走各的
javascript
const results = await pipeline(
['Hook入门', 'Hook进阶', 'Hook实战'],
(topic) => agent(`搜 ${topic} 资料`),
(materials, topic) => agent(`根据资料写 ${topic} 大纲`),
(outline, topic) => agent(`根据大纲写 ${topic} 初稿`),
)
三个主题同时启动,但每个主题独立走完"搜资料→写大纲→写初稿"全程。A 搜完资料立刻去写大纲,不用等 B 和 C 搜完。快的先交稿,慢的自己慢慢跑。
就像工厂流水线:三件产品同时上传送带,第一件到第二道工序时,第三件可能还在第一道工序。
三、时间线对比
三个主题,每个走三步,用同一个例子看两种写法差多少:
ini
parallel 分三个阶段(每阶段等最慢的):
阶段1 搜资料: 入门▓▓ 进阶▓▓▓▓▓ 实战▓▓ 等 5 分钟
阶段2 写大纲: 入门▓▓▓ 进阶▓▓ 实战▓▓▓ 等 3 分钟
阶段3 写初稿: 入门▓▓▓▓▓▓ 进阶▓▓▓▓ 实战▓▓▓ 等 6 分钟
总耗时:5 + 3 + 6 = 14 分钟,其中 7 分钟在干等
pipeline(各走各的):
入门:[搜▓▓]→[大纲▓▓▓]→[初稿▓▓▓▓▓▓] ✅ 11 分钟
进阶:[搜▓▓▓▓▓]→[大纲▓▓]→[初稿▓▓▓▓] ✅ 11 分钟
实战:[搜▓▓]→[大纲▓▓▓]→[初稿▓▓▓] ✅ 8 分钟
总耗时:11 分钟,没人等
任务越多、每步耗时差异越大,pipeline 的优势越明显。10 个主题用 parallel,最慢那个能把所有人拖跨;用 pipeline,快的早交早了。
四、barrier:什么时候该等
parallel 自带一个 barrier(屏障):所有任务到齐了才放行。
什么时候需要 barrier? 下一步真的需要所有人的结果时:
scss
// 需要:去重必须等所有维度的发现都到齐
const allFindings = await parallel([
() => agent('查 Bug'),
() => agent('查安全问题'),
() => agent('查性能问题'),
])
const unique = 去重(allFindings.flat()) // 不全到齐没法去重
arduino
// 不需要:三篇文章各写各的,谁写完谁先去润色
// 用 pipeline,别用三个 parallel 阶段
判断标准就一句话:下一步要不要把所有人的结果放一起处理? 要就 parallel,不要就 pipeline。
五、常见错误
1. 单个任务也用 pipeline
javascript
// 没必要,直接 agent 串联
await pipeline(['一个主题'], (t) => agent('搜'), (r) => agent('写'))
2. 不相关的任务拆成多个 parallel
scss
// 四个任务互不依赖,一个 parallel 就行
const a = await parallel([() => agent('A'), () => agent('B')])
const b = await parallel([() => agent('C'), () => agent('D')])
3. 中间是纯 JS 处理,却开了新的 parallel 阶段
scss
// 去重是 JS 操作,不花时间,不需要 barrier
const all = await parallel([查A(), 查B(), 查C()])
const filtered = all.filter(Boolean) // 纯 JS,瞬间完成
// 下一步直接 pipeline,不用再 parallel
六、决策口诀
csharp
下一步要汇总所有人的结果 → parallel(开会等人到齐)
各干各的互不依赖 → pipeline(流水线各走各的)
只有一个任务 → 直接 await agent 串联
不知道要跑多少轮 → while 循环(下一篇讲)
自测几个场景:
| 场景 | 用哪个 |
|---|---|
| 三个源同时搜,搜完一起分析 | parallel |
| 十个文件各自检查→修复→验证 | pipeline |
| 写完文章从三个维度同时审查 | parallel |
| 五个主题各写各的文章 | pipeline |
小结
arduino
parallel:同时启动,等最慢的,自带 barrier
pipeline:同时启动,各走各的,没有 barrier
barrier 只在"需要所有人结果才能下一步"时才需要
pipeline 传多个变量用 .then() 打包
口诀:开会用 parallel,流水线用 pipeline