多生产者、多消费者,利用通道传递数据,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