生产消费模型-使用channel控制生产速度
package main import ( "fmt" "sync" ) type Producer struct { ID int DataStream chan int WaitGroup *sync.WaitGroup } func (p *Producer) Produce(concurrency <-chan struct{}) { defer p.WaitGroup.Done() for i := 0; i < 10; i++ { <-concurrency // 允许堆积的计数-1 p.DataStream <- i fmt.Printf("Producer %d produced data: %d\n", p.ID, i) }//生产结束要关闭DataStream,否则consumer会一直阻塞 close(p.DataStream) } type Consumer struct { ID int DataStream chan int WaitGroup *sync.WaitGroup } func (c *Consumer) Consume(concurrency chan<- struct{}) { defer c.WaitGroup.Done() for data := range c.DataStream { fmt.Printf("Consumer %d consumed data: %d\n", c.ID, data) concurrency <- struct{}{} // 允许堆积的计数+1 } } func main() { //保存消费数据的chan dataStream := make(chan int, 10) //控制生产速度的chan concurrency := make(chan struct{}, 5) // 设置生产者允许堆积的最大消息数 for i := 0; i < 5; i++ { concurrency <- struct{}{} } var wg sync.WaitGroup producer := &Producer{ ID: 1, DataStream: dataStream, WaitGroup: &wg, } consumer := &Consumer{ ID: 1, DataStream: dataStream, WaitGroup: &wg, } wg.Add(2) go producer.Produce(concurrency) go consumer.Consume(concurrency) wg.Wait() close(concurrency) // 关闭并发信号通道 }
等风起的那一天,我已准备好一切
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2020-08-01 全排列的应用
2019-08-01 优先队列---使用
2019-08-01 Problem B: Bulbs
2019-08-01 Problem I: Ingenious Lottery Tickets
2019-08-01 poj 2528 Mayor's posters