快捷搜索: 王者荣耀 脱发

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()
}

相关文档

经验分享 程序员 微信小程序 职场和发展