sync.WaitGroup
go
package main
import (
"fmt"
"strconv"
"sync"
"time"
)
defer wg.Done()
for j := range jobs {
fmt.Println("我是 worker", id, "我要开始工作辣,我要处理", j)
time.Sleep(time.Second) // 假装在工作
results <- "我是 " + strconv.Itoa(id) + ",我处理完了" + strconv.Itoa(j)
}
}
func main() {
const numWorkers = 3
const numJobs = 10
jobs := make(chan int, numJobs)
results := make(chan string, numJobs)
var wg sync.WaitGroup
// 启动 worker
for w := 1; w <= numWorkers; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
// 派发任务
go func() {
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
}()
// 等待所有 worker 完成,然后关闭 results
go func() {
wg.Wait()
close(results)
}()
// 消费结果
for r := range results {
fmt.Println("result:", r)
}
}最佳实践:
- main 或启动 goroutine 的地方控制
- worker 只负责“干活”,不需要关心全局计数器