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

Go worker pool:别让后台任务无限制创建 goroutine

来源:Golang学习网专题原创

时间:2026-06-08 21:06:00 472浏览 收藏

消息消费、批量导入、图片处理和报表任务都容易写成“来一个任务开一个 goroutine”。短期看吞吐高,长期看任务高峰会让内存、连接池和 CPU 一起抖动。worker pool 用固定并发换稳定性。

队列必须有容量

无界队列只是把压力藏到内存里。任务队列要有长度上限,超过后选择阻塞、丢弃、返回繁忙或落盘。

worker 数量来自资源预算

如果每个任务都会访问数据库,worker 数不能超过数据库连接池预算。CPU 密集任务则要参考 CPU 核心和单任务耗时。

关闭时要排水

服务退出时要停止接收新任务,等待已有任务完成或超时取消。直接关闭进程会留下半写入状态。

生产场景

适用于消息消费、图片处理、报表生成、批量导入和异步通知。任务来源不稳定时,固定 worker 数可以把资源消耗锁在可预测范围。

关键指标

  • 队列长度、入队失败和任务等待时间
  • worker 忙闲比例与单任务处理耗时
  • 任务失败、重试和死信数量

常见误区

  • 用无界队列隐藏压力直到内存被打满
  • worker 数量超过数据库或外部 API 容量
  • 退出时直接杀进程,导致任务半处理

落地建议

建议给队列设置明确容量和满队列策略。重要任务可落盘或进入消息队列,普通任务可以返回繁忙。停机时先停止接收新任务,再用有限时间等待 worker 排水。

代码示例

jobs := make(chan Job, 100)
for i := 0; i 

上线检查

  • 队列长度可观测。
  • worker 数和下游资源预算一致。
  • 服务停止时能关闭队列并等待 worker 退出。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>