登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go教程

Go fan-in/fan-out 模式:并发流水线如何正确收口

来源:Golang学习网专题原创

时间:2026-06-09 07:06:00 650浏览 收藏

fan-out 把任务分散给多个 worker,fan-in 再把结果聚合回来。这个模式适合批处理、爬取和计算任务,但最容易出错的不是处理逻辑,而是 channel 关闭和错误取消。

谁发送谁关闭

通常由发送方关闭 channel。多个发送方时,不要让每个 worker 都尝试 close,可以用 WaitGroup 等所有 worker 完成后由单独 goroutine 关闭结果 channel。

错误要能停止生产

如果下游已经失败,生产者还在继续塞任务,会浪费资源。context 应该贯穿生产、处理和聚合。

结果聚合要消费到底

如果聚合端提前返回,worker 可能阻塞在发送结果上。要么使用 context 让 worker 停止,要么确保结果 channel 被排空。

生产场景

适用于爬取、批处理、批量计算、日志聚合和多阶段数据加工。流水线的关键是让生产、处理和聚合在错误时一起停。

关键指标

  • 每个阶段的输入输出速率
  • 结果 channel 堵塞次数和 worker 退出时间
  • 错误发生后仍继续处理的任务数量

常见误区

  • 多个发送者抢着 close 同一个 channel
  • 聚合端提前返回导致 worker 阻塞发送
  • 生产者不知道下游已经失败,继续制造任务

落地建议

建议为每条流水线画出 channel 所有权图:谁发送、谁关闭、谁消费、错误从哪里退出。用 context 贯穿所有阶段,并在测试中覆盖提前取消和部分失败。

代码示例

results := make(chan Result)
g, ctx := errgroup.WithContext(ctx)
for i := 0; i 

上线检查

  • channel 关闭责任清晰。
  • 错误能取消生产和消费。
  • 提前返回不会留下阻塞发送者。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>