package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for job := range jobs {
fmt.Printf("Worker %d started job %d\n", id, job)
// 模拟实际工作
fmt.Printf("Worker %d finished job %d\n", id, job)
}
}
func main() {
const maxGoroutines = 3
jobs := make(chan int, 10)
var wg sync.WaitGroup
// 启动goroutine池
for i := 1; i <= maxGoroutines; i++ {
wg.Add(1)
go worker(i, jobs, &wg)
}
// 提交任务
for j := 1; j <= 10; j++ {
jobs <- j
}
close(jobs)
// 等待所有任务完成
wg.Wait()
}
- 原理:
- 首先定义了一个
worker
函数,该函数从 jobs
通道中接收任务并处理。
- 在
main
函数中,创建了一个带有缓冲区的 jobs
通道来传递任务,并且创建了一个 sync.WaitGroup
来等待所有任务完成。
- 通过
for
循环启动固定数量(maxGoroutines
)的 goroutine
作为工作池,每个 goroutine
都会调用 worker
函数处理任务。
- 然后向
jobs
通道发送任务,发送完成后关闭 jobs
通道。这会使得 worker
函数中的 for... range
循环结束,从而优雅地关闭所有 goroutine
。
- 最后调用
wg.Wait()
等待所有 goroutine
完成任务。