go worker pool 通过固定数量的 goroutine 消费同一个任务队列。worker 数决定同时处理的任务上限,队列容量决定最多能积压多少等待中的任务。

用三个 worker 消费同一队列
保存为 main.go。每个 worker 一次处理一项。结果通道由主协程持续读取。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
jobs := make(chan int, 4)
results := make(chan int)
var workers sync.WaitGroup
for worker := 0; worker < 3; worker++ {
workers.Add(1)
go func() {
defer workers.Done()
for value := range jobs {
time.Sleep(10 * time.Millisecond)
results <- value * value
}
}()
}
go func() {
defer close(jobs)
for value := 1; value <= 5; value++ {
jobs <- value
}
}()
go func() {
workers.Wait()
close(results)
}()
count, sum := 0, 0
for value := range results {
count++
sum += value
}
fmt.Println(count, sum)
}
队列满时,提交者会等待。结果顺序取决于完成时机。
验证完整消费结果
运行程序并检查结果。
go run main.go # 5 55
平方和为 55,说明五项任务都返回了结果。
用竞态检测验证共享数据改动
在支持竞态检测的环境中运行。
go run -race main.go
示例由主协程独占统计变量。若后续要保留输入顺序,可让每条结果携带原始索引。

















