Go管道模式是用channel连接多阶段goroutine,实现数据流式处理:输入→处理→合并→输出;各阶段独立解耦,需正确关闭channel、用errgroup管理生命周期、fan-in安全汇聚结果。

Go 的并发管道模式本质是用 channel 连接多个 goroutine 阶段,每个阶段专注一类操作:输入 → 处理1 → 处理2 → 合并 → 输出。关键不是“多开 goroutine”,而是让数据像水流一样自然流过各阶段,各阶段独立运行、解耦协作。
每个阶段应接收输入 channel,返回输出 channel,并在输入关闭后主动退出。推荐统一使用 errgroup.Group 管理 goroutine 生命周期,避免 goroutine 泄漏:
inCh chan Item;读完后 close(inCh)
sync.WaitGroup 或 errgroup 等待所有上游完成,再用 for range 从多个输出 channel 收集结果(可用 select + default 非阻塞轮询,或 fan-in 函数统一汇聚)合并不是简单 for-range 多个 channel —— 若某路未关闭,range 会永久阻塞。正确做法是:
outCh chan Result;所有转发 goroutine 结束后,close(outCh)
for res := range outCh 安全消费,无需担心某路卡住以下是一个处理字符串切片、转大写、过滤空串、统计长度的三阶段管道:
立即学习“go语言免费学习笔记(深入)”;
func main() {
items := []string{"hello", "", "world", "go", ""}
<pre class='brush:php;toolbar:false;'>// 阶段1:输入
in := make(chan string, len(items))
go func() {
defer close(in)
for _, s := range items {
in <- s
}
}()
// 阶段2:转大写(并行3个goroutine)
upper := upperCase(in, 3)
// 阶段3:过滤空串 + 统计长度(单goroutine,也可并行)
resultCh := countLen(upper)
// 合并并打印
for res := range resultCh {
fmt.Printf("'%s' -> %d\n", res.str, res.len)
}}
func upperCase(in aitGroup wg.Add(workers) for i := 0; i
func countLen(in
以上就是如何使用Golang实现并发数据处理管道_分阶段处理并合并结果的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号