今天学习了一下生产者消费者模型,也是面试重点,在此记录一下
(1)基本模式
生产者每天生产一件
生产一件消费者就消费一件
消费十轮结束
(2)实现细节
生产者写入商品管道
消费者阻塞等待商品管道,读出
消费者读出一次就写入计数管道一次
主协程阻塞在计数管道,读出十个就结束
package main
import (
"fmt"
"strconv"
"time"
)
type Product struct {
Name string
}
func main() {
chanShop := make(chan Product, 5) //商店管道
chanCount := make(chan int, 5) //计数管道
go Produce(chanShop) //生产者
go Consume(chanShop,chanCount) //消费者
for i:=0;i<10;i++{
<-chanCount
}
fmt.Println("main over")
}
func Consume(chanShop <-chan Product, chanCount chan<- int) {
for {
product := <-chanShop
fmt.Println("消费者吃掉了", product)
chanCount <- 1
}
}
func Produce(chanShop chan<- Product) {
for {
product := Product{Name: "产品" + strconv.Itoa(time.Now().Second())}
chanShop <- product
fmt.Println("生产者生产了一个", product)
time.Sleep(1 * time.Second)
}
}
运行效果是:
每个人运行结果不太一样,因为用了时间函数