Go协程间通信 # 生产者-消费者模型

Go协程间通信之 生产者-消费者模型

通信原则

Go开发有一个经常提及的原则:

不要通过共享内存来通信(互斥锁同步),而要用通信来共享内存。

前言

在其他模式的开发语言中,比如Java有个常见的生产者-消费者模式,通过多个线程池与多个BlockingQueue进行交互,如LinkBlockedQueueArrayBlockedQueue等 ,由于队列内部通过锁机制帮我们集成了同步的功能,程序业务层不需要关心多线程对队列的竞争,所以可以放心的使用。
而来到Go这边,由于channel天生具备同步的特性,结合上面提到的通信原则,也可以较简单的运用于生产者-消费模型

示例

  1. 创建一个共享队列作为生产者消费者连接的管道
var (
    //通信管道大小
    QUEUE_SIZE            = conf.OptiInt("ext.queueSize", 5)
    //生产者并发度
	PRODUCE_SIZE            = conf.OptiInt("ext.prodSize", 3)
	//消费者并发度
	CONSUME_SIZE            = conf.OptiInt("ext.consSize", 3)
)

//共享队列
msgQueue := make(chan []byte, QUEUE_SIZE)
  1. 消费端业务
/*
*   CNum标识不同消费者的序号,由外部传入
*/
func Consume(CNum int, msg chan []byte)  {
   
	for value := range msg {
   
		logrus.Infof("# Consumer CNum.%d, take cake with value: %s.", CNum
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值