借助管道,实现生产者,消费者模型
package main
import (
"fmt"
"sync"
)
func producer(ch chan<- int, wg, counter *sync.WaitGroup) {
defer wg.Done()
defer counter.Done()
for i := 0; i < 5; i++ {
ch <- i
}
}
func consumer(ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for v := range ch {
fmt.Println(v)
}
}
func main() {
ch := make(chan int, 10)
var wg, counter sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
counter.Add(1)
go producer(ch, &wg, &counter)
}
for i := 0; i < 3; i++ {
wg.Add(1)
go consumer(ch, &wg)
}
go func() {
counter.Wait()
close(ch)
}()
wg.Wait()
}