生产消费模型-使用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) // 关闭并发信号通道
}
复制代码

 

posted @   知道了呀~  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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
点击右上角即可分享
微信分享提示