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
发布了48 篇原创文章 · 获赞 56 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhetmdoubeizhanyong/article/details/105137887
今日推荐