go簡單實現fan out/worker模式

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章