package main
import (
"fmt"
"sync"
"time"
)
var (
queue = make(chan int, 5) // 创建一个容量为5的缓冲区
wg sync.WaitGroup // 用于等待程序结束
producer = 10 // 生产者产出的数据量
consumers = 2 // 消费者的数量
)
// 消费者函数
func consumer(id int) {
defer wg.Done()
for {
// 从channel中取数据,如果没有数据,会阻塞
num, more := <-queue
if more {
fmt.Printf("Consumer %d consumes: %d\n", id, num)
} else {
fmt.Printf("Consumer %d exiting...\n", id)
return
}
}
}
// 生产者函数
func producer() {
for i := 1; i <= producer; i++ {
queue <- i
fmt.Printf("Producer produces: %d\n", i)
time.Sleep(time.Second) // 模拟生产者生产数据的时间
}
close(queue) // 生产完毕,关闭channel
}
func main() {
// 设置等待组的数量
wg.Add(consumers)
// 启动消费者
for i := 1; i <= consumers; i++ {
go consumer(i)
}
// 启动生产者
go producer()
// 等待所有的goroutines完成
wg.Wait()
fmt.Println("All tasks are done!")
}