GO并发 使用channel实现生产者/消费者模型

前言

生产者/消费者问题是并发编程中的经典问题,也被称为有限缓冲区问题,此模型中有生产者和消费者两种组件:

  • 生产者不断生成一定量的数据放到缓冲区中

  • 消费者不断消耗缓冲区中的数据

注意:

  • 缓冲区的大小是有限的,当缓冲区满了后,生产者进入阻塞状态。当缓冲区为空时,消费者进入阻塞状态。

  • 同一份数据不能被多次消费。

  • 多消费者和多生产者场景时,应该合理设计代码,避免数据竞争。

使用channel实现

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func Provider(data chan<- int,name string){
	for i:=0;i<40;i++{
	//保证传入i的操作和print操作"原子运行"
		select {
		case data<-i:
			fmt.Println(name,"生产了:",i)
		}
	}
	wg.Done()
}

func Consumer(data <-chan int,name string){
	for i:=0;i<40;i++ {
		fmt.Println(name,"读取了",<-data)
	}
	wg.Done()
}

func main() {
	//定义缓冲区大小
	data:=make(chan int,10)
	wg.Add(6)
	go Provider(data,"p1")
	go Provider(data,"p2")
	go Provider(data,"p3")
	go Consumer(data,"c1")
	go Consumer(data,"c2")
	go Consumer(data,"c3")
	wg.Wait()
}

相关文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨雨不怕雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值