赞
踩
多生产者、多消费者,利用通道传递数据,WaitGroup控制生产者、消费者执行结束。
package main import ( "fmt" "sync" ) func main() { wgP := &sync.WaitGroup{} wgC := &sync.WaitGroup{} var num = 5 ch := make(chan int, num) // 消费者 for i := 0; i < num; i++ { wgC.Add(1) go Consumer(wgC, ch, i) } // 生产者 for i := 0; i < num; i++ { wgP.Add(1) go Producter(wgP, ch) } wgP.Wait() // 生产者发送结束后, 要关闭通道,否则消费者会阻塞造成协程泄漏 close(ch) wgC.Wait() } func Producter(wg *sync.WaitGroup, ch chan int) { defer wg.Done() for i := 0; i < 10; i++ { ch <- i } } func Consumer(wg *sync.WaitGroup, ch chan int, i int) { defer wg.Done() for item := range ch { fmt.Printf("%d号协程: %d\n", i+1, item) } }
运行结果:
2号协程: 0 2号协程: 5 2号协程: 6 2号协程: 0 2号协程: 0 2号协程: 0 3号协程: 2 5号协程: 4 5号协程: 7 1号协程: 1 2号协程: 1 2号协程: 0 2号协程: 1 2号协程: 2 2号协程: 2 2号协程: 2 2号协程: 3 2号协程: 3 2号协程: 2 2号协程: 3 2号协程: 9 1号协程: 1 1号协程: 4 1号协程: 5 1号协程: 6 1号协程: 7 1号协程: 8 1号协程: 9 1号协程: 5 5号协程: 8 5号协程: 5 5号协程: 6 5号协程: 7 5号协程: 8 5号协程: 9 3号协程: 1 3号协程: 4 3号协程: 5 3号协程: 6 3号协程: 7 3号协程: 8 3号协程: 9 2号协程: 4 4号协程: 3 1号协程: 4 1号协程: 9 5号协程: 3 3号协程: 6 2号协程: 7 4号协程: 8
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。