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