Go工作池通过固定goroutine复用任务,用channel分发与收集结果,WaitGroup协调生命周期;含jobs/results通道、worker数及初始化;worker循环读取jobs并发送结果;提交后关闭jobs再wg.Wait,最后关results。
用 Go 实现工作池(Worker Pool),核心是通过固定数量的 goroutine 复用执行任务,避免无节制创建 goroutine 导致内存耗尽或调度开销过大。关键在于用 channel 控制任务分发与结果收集,并用 WaitGroup 或关闭信号协调生命周期。
工作池通常包含:任务输入 channel、结果输出 channel、worker 数量、以及用于等待所有 worker 结束的 sync.WaitGroup。
make(chan Job, 100))在启动阶段,用 for 循环启动指定数量的 goroutine,每个 goroutine 运行同一个 worker 函数:
for job := range jobs 持续接收任务(channel 关闭时自动退出循环)defer wg.Done() 确保 worker 退出时通知 WaitGroup任务提交只需向 jobs channel 发送 Job 实例;关闭则需两步:
close(jobs)),通知 worker 不再有新任务wg.Wait() 等待所有 worker 退出,之后可安全关闭 results channel(如需
)results channel 可以是 chan Result 或 chan *Result,消费端按需处理:
不复杂但容易忽略。