模拟订单
在实际的开发中,生产者消费者模式应用也非常的广泛,例如:在电商网站中,订单处理,就是非常典型的生产者消费者模式。
当很多用户单击下订单按钮后,订单生产的数据全部放到缓冲区(队列)中,然后消费者将队列中的数据取出来发送者仓库管理等系统。
通过生产者消费者模式,将订单系统与仓库管理系统隔离开,且用户可以随时下单(生产数据)。如果订单系统直接调用仓库系统,那么用户单击下订单按钮后,要等到仓库系统的结果返回。这样速度会很慢。
下面模拟一个下订单处理的过程。
package main
import "fmt"
type OrderInfo struct { // 创建结构体类型OrderInfo,只有一个id 成员
id int
}
func producer2(out chan <- OrderInfo) { // 生成订单——生产者
for i:=0; i<10; i++ { // 循环生成10份订单
order := OrderInfo{id: i+1}
out <- order // 写入channel
}
close(out) // 写完,关闭channel
}
func consumer2(in <- chan OrderInfo) { // 处理订单——消费者
for order := range in { // 从channel 取出订单
fmt.Println("订单id为:", order.id) // 模拟处理订单
}
}
func main() {
ch := make(chan OrderInfo) // 定义一个双向 channel, 指定数据类型为OrderInfo
go producer2(ch) // 建新协程,传只写channel
consumer2(ch) // 主协程,传只读channel
}
OrderInfo为订单信息,这里为了简单只定义了一个订单编号属性,然后生产者模拟10个订单,消费者对产生的订单进行处理。