Go 技巧:使用带缓冲的通道实现高效工作池

简介: Go 技巧:使用带缓冲的通道实现高效工作池

Go 技巧:使用带缓冲的通道实现高效工作池

Go 语言的并发模型是其最大亮点之一,而通道(channel)则是 goroutine 之间通信的核心。今天分享一个实用技巧:使用带缓冲的通道实现工作池,有效控制并发数量,防止资源耗尽。

传统方式的痛点

初学者常直接用 go func() 启动任务,但当任务量巨大时,会创建大量 goroutine,导致调度压力和内存暴涨。

缓冲通道实现工作池

func workerPool(tasks []Task, workerNum int) []Result {
   
    taskCh := make(chan Task, len(tasks))
    resultCh := make(chan Result, len(tasks))

    // 启动 worker
    for i := 0; i < workerNum; i++ {
   
        go func() {
   
            for task := range taskCh {
   
                resultCh <- process(task)
            }
        }()
    }

    // 发送任务
    for _, task := range tasks {
   
        taskCh <- task
    }
    close(taskCh)

    // 收集结果
    results := make([]Result, 0, len(tasks))
    for i := 0; i < len(tasks); i++ {
   
        results = append(results, <-resultCh)
    }

    return results
}

关键点解析

  1. 缓冲通道taskCh 的缓冲大小等于任务数,避免发送者阻塞
  2. worker 数量可控:通过 workerNum 精确控制并发 goroutine 数量
  3. 任务分发:多个 worker 从同一个通道竞争读取,自动负载均衡
  4. 结果收集:使用另一个通道收集处理结果

使用示例

tasks := generateTasks(1000)
results := workerPool(tasks, 10) // 10 个 worker 处理 1000 个任务

这种模式在实际项目中广泛使用,如批量数据处理、API 请求限流等场景。通过调整 worker 数量,可以找到性能和资源消耗的最佳平衡点。

小贴士:worker 数量通常设置为 CPU 核心数的 2-4 倍,但具体需结合任务类型(CPU 密集型还是 IO 密集型)进行基准测试确定。

相关文章
|
2月前
|
Go 数据处理
5个实用的Go编程技巧
5个实用的Go编程技巧
235 134
|
2月前
|
存储 Go
Go中空结构体`struct{}`零内存占用,是高效编程的隐形利器:用于无数据通道信号、内存最优的map集合、无状态接口实现及语法占位,语义清晰且零开销。
Go中空结构体`struct{}`零内存占用,是高效编程的隐形利器:用于无数据通道信号、内存最优的map集合、无状态接口实现及语法占位,语义清晰且零开销。
202 138
|
2月前
|
Go
Go技巧:用溢出处理提升代码健壮性
Go技巧:用溢出处理提升代码健壮性
206 136
|
2月前
|
Go 数据库 微服务
Go语言技巧:利用Context实现优雅的超时控制
Go语言技巧:利用Context实现优雅的超时控制
248 129
|
2月前
|
机器学习/深度学习 编解码 JSON
FantasyWorld 正式开源!一次前向传播,同时生成视频与 3D 几何——视频世界模型的新范
高德地图发布「FantasyWorld」——新一代几何一致世界模型,单次前向即可生成高质量视频与3D场景(深度图、点云、相机轨迹),无需后处理或逐场景优化。ICLR 2026录用,WorldScore榜首,已开源代码与模型。
395 6
|
2月前
|
人工智能 运维 安全
从技术角度解析:网文平台如何判定你的小说有 AI 痕迹?
本文从技术角度解析网文平台AI检测原理:不识别工具,而检测文本统计异常。涵盖词汇多样性、句长波动、短语重复等8大维度,详解多维加权评分机制(0–100分),并提供工程级应对策略——重结构、轻生成,构建“生成—重构—校验”闭环。(239字)
649 3
|
2月前
|
安全 JavaScript
HTML编码/解码 在线工具分享
一款基于Vue 3开发的轻量级HTML编码/解码在线工具,支持实时转换`&lt;`、`&gt;`等实体字符与普通文本,无需安装、开网页即用。适用于富文本编辑、网页内容处理及安全转义,操作仅三步:输入→点击→复制。
204 0
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
机器学习/深度学习 数据采集 监控
基于深度学习的婴儿哭声识别 | 从数据预处理到模型训练全流程实战【附源码+数据集】
本文详解婴儿哭声识别全流程:基于Cry Sense数据集,涵盖音频格式转换、采样率统一(16kHz)、数据增强(时域/频域)、梅尔频谱/MFCC特征提取及数据集划分。附完整源码与数据集,助力构建智能监护系统。
基于深度学习的婴儿哭声识别 | 从数据预处理到模型训练全流程实战【附源码+数据集】
|
12月前
|
人工智能 网络协议 Linux
MCP 协议: Streamable HTTP 是最佳选择
随着AI应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期MCP仓库的PR #206引入了一个全新的Streamable HTTP传输层替代原有的HTTP+SSE传输层。本文将详细分析该协议的技术细节和实际优势。
6681 102