Go语言并发模式:扇出/扇入的实用技巧

简介: Go语言并发模式:扇出/扇入的实用技巧

Go语言并发模式:扇出/扇入的实用技巧

在Go并发编程中,扇出/扇入模式是处理大量任务的利器。今天分享一个实际项目中验证过的实现技巧。

问题场景

假设我们需要并发处理1000个URL,每个URL请求耗时不等,需要控制并发数并收集所有结果。扇出阶段分发任务,扇入阶段聚合结果。

实现方案

func worker(id int, jobs <-chan string, results chan<- string) {
   
    for job := range jobs {
   
        // 模拟耗时操作
        result := fmt.Sprintf("worker %d processed %s", id, job)
        results <- result
    }
}

func fanIn(results ...<-chan string) <-chan string {
   
    var wg sync.WaitGroup
    out := make(chan string)

    output := func(c <-chan string) {
   
        for v := range c {
   
            out <- v
        }
        wg.Done()
    }

    wg.Add(len(results))
    for _, c := range results {
   
        go output(c)
    }

    go func() {
   
        wg.Wait()
        close(out)
    }()
    return out
}

关键技巧

  1. 有界队列:使用带缓冲的channel避免goroutine阻塞
  2. 优雅退出:通过sync.WaitGroup确保所有worker完成后再关闭结果通道
  3. 错误处理:建议在results channel中传递结构体,包含error字段

性能优化

  • 根据CPU核心数设置worker池大小
  • 使用context超时控制避免goroutine泄漏
  • 考虑使用semaphore库实现更精细的并发控制

这个模式在我处理百万级日志分析时表现优异,将处理时间从小时级降至分钟级。掌握扇出/扇入,Go并发编程将如虎添翼。

目录
相关文章
|
存储 编译器 C语言
你知道数据在内存中是如何存储的嘛?(二)
你知道数据在内存中是如何存储的嘛?(二)
1485 0
|
druid Java 数据库连接
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
2647 0
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
|
3月前
|
人工智能 运维 监控
Agent 开发范式演进:从环境工程出发,“简化”多源实时上下文
本文整理自阿里云智能集团高级技术专家沈林在 2026 GenAICon 中国生成式 AI 大会上的分享。
364 40
|
4月前
|
人工智能 弹性计算 自然语言处理
OpenClaw是什么?阿里云OpenClaw一键部署官方教程(原Clawdbot/Moltbot)
2026年,开源AI智能体OpenClaw(“龙虾AI”)爆火。它是一款遵循MIT开源协议的AI自动化引擎与个人助手平台,能将大模型从“对话”变为“执行任务”。其核心架构由网关、智能体、技能和记忆构成,可自主行动、跨平台协同且高度可扩展。阿里云提供官方镜像一键部署方案,新用户首月服务器成本9.9元,还有大模型免费额度。
1147 21
|
安全 Java 网络安全
Java 实现 SMTP 协议调用的详细示例及实战指南 SMTP Java 调用示例
本文介绍了如何使用Java调用SMTP协议发送邮件,涵盖SMTP基本概念、JavaMail API配置、代码实现及注意事项,适合Java开发者快速掌握邮件发送功能集成。
1535 0
|
IDE Java 数据库连接
解决Java环境中无法识别org.mybatis.spring.annotation.MapperScan的问题。
祝你好运,在这场MyBatis的魔法冒险中获得胜利!记住,魔法书(官方文档)永远是你最好的朋友。
1034 18
解决方案-CMake error: error in configuration process, project files may be invalid(Windows&VS可参考)
解决方案-CMake error: error in configuration process, project files may be invalid(Windows&VS可参考)
5119 0
|
Linux Go iOS开发
Go语言新手指南:正确使用GOPATH的步骤
Go语言新手指南:正确使用GOPATH的步骤
7085 0
|
Java 中间件 API
【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)
【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)
959 107
【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)
|
SQL XML Java
【MyBatis】 MyBatis与MyBatis-Plus的区别
【MyBatis】 MyBatis与MyBatis-Plus的区别
8560 0
【MyBatis】 MyBatis与MyBatis-Plus的区别

热门文章

最新文章