func pool(wg *sync.WaitGroup, workers int, jobs []int) {
//设置工作台
deskCh := chan int
//告诉工人让他们去这个工作台取任务
for i := 0; i < workers; i++ {
go worker(wg, deskCh)
}
//向工作台发布任务
for _, job := range jobs {
deskCh <- job
}
//关闭工作台通道(非阻塞通道一定要记得手动关闭)
close(deskCh)
}
func worker(wg *sync.WaitGroup, deskCh chan int) {
defer wg.Done()
for {
job, ok := <-deskCh;
if !ok {
//任务已分配完,结束工作
return
}
//do job
fmt.Println(time.Now().Unix(), "proccessed job", job)
}
}
func main() {
workerNum := 30
jobs := []int{1,2,3,4,5,7,8,9,0,6}
var wg sync.WaitGroup
wg.Add(workerNum)
go pool(&wg, workerNum, jobs)
wg.Wait()
}
输出:
1585281654 processed task 0
1585281654 processed task 1
1585281654 processed task 2
1585281654 processed task 3
1585281654 processed task 4
1585281654 processed task 5
1585281654 processed task 7
1585281654 processed task 6
1585281654 processed task 9
1585281654 processed task 8