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