worker pool模式也就是工作池模式,核心思想是预先创建一定数量的worker协程,通过统一的任务通道分发任务,避免无限制创建goroutine带来的资源消耗问题,在Golang中可以通过goroutine配合channel快速实现。

核心组件设计
一个基础的worker pool通常包含三个核心部分:
- 任务通道:用于接收外部提交的任务,所有待处理的任务都会先进入这个通道
- Worker协程:预先启动的固定数量的协程,持续从任务通道读取任务并执行
- 结果通道:可选组件,用于worker执行完任务后返回处理结果
基础实现示例
下面是一个简单的worker pool实现,支持提交任务、等待所有任务完成、优雅关闭:
package main
import (
"fmt"
"sync"
"time"
)
// Task 定义任务类型,这里用函数表示具体任务逻辑
type Task func() interface{}
// WorkerPool 工作池结构体
type WorkerPool struct {
taskChan chan Task // 任务通道
resultChan chan interface{} // 结果通道
wg sync.WaitGroup // 用于等待所有worker完成
workerNum int // worker数量
}
// NewWorkerPool 创建工作池,传入worker数量和任务通道缓冲区大小
func NewWorkerPool(workerNum int, taskBufSize int) *WorkerPool {
pool := &WorkerPool{
taskChan: make(chan Task, taskBufSize),
resultChan: make(chan interface{}, taskBufSize),
workerNum: workerNum,
}
return pool
}
// worker 单个worker的执行逻辑
func (p *WorkerPool) worker() {
defer p.wg.Done()
for task := range p.taskChan {
// 执行任务,将结果写入结果通道
result := task()
p.resultChan <- result
}
}
// Start 启动工作池,启动指定数量的worker
func (p *WorkerPool) Start() {
p.wg.Add(p.workerNum)
for i := 0; i < p.workerNum; i++ {
go p.worker()
}
}
// Submit 提交任务到工作池
func (p *WorkerPool) Submit(task Task) {
p.taskChan <- task
}
// Close 关闭工作池,先关闭任务通道,等待所有worker完成后关闭结果通道
func (p *WorkerPool) Close() {
close(p.taskChan)
p.wg.Wait()
close(p.resultChan)
}
// GetResult 获取任务结果,这里简单用循环读取,实际可根据需求调整
func (p *WorkerPool) GetResult() []interface{} {
var results []interface{}
for res := range p.resultChan {
results = append(results, res)
}
return results
}
func main() {
// 创建3个worker的工作池,任务缓冲区大小为10
pool := NewWorkerPool(3, 10)
pool.Start()
// 提交5个任务
for i := 0; i < 5; i++ {
idx := i
pool.Submit(func() interface{} {
time.Sleep(time.Second) // 模拟任务执行耗时
return fmt.Sprintf("task %d finished", idx)
})
}
// 所有任务提交完成后关闭工作池
pool.Close()
// 获取并打印结果
results := pool.GetResult()
for _, res := range results {
fmt.Println(res)
}
}实现要点说明
在实际实现时需要注意几个细节:
- 任务通道的缓冲区大小需要根据实际任务提交频率调整,太小可能导致提交任务时阻塞,太大可能浪费内存
- 关闭工作池时需要先关闭任务通道,再等待所有worker处理完剩余任务,最后关闭结果通道,避免向已关闭的通道写数据导致panic
- 如果不需要返回结果,可以去掉结果通道相关逻辑,简化实现
适用场景
worker pool模式适合以下场景:
- 需要控制并发数量,避免无限制创建goroutine的场景
- 任务类型相似、处理流程统一的批量任务处理
- 需要复用协程资源,减少协程创建销毁开销的场景
通过调整worker数量和任务通道缓冲区大小,可以灵活适配不同的业务需求,是Golang并发编程中非常实用的设计模式。
Golangworker_poolgoroutinechannel修改时间:2026-06-04 16:43:56