Go 语言入门三部曲(三):能用 Go 写“生产-消费者”模型

网友投稿 199 2022-08-23

Go 语言入门三部曲(三):能用 Go 写“生产-消费者”模型

文章目录

到最后一篇了,让我们再回顾一下这三篇的设定。 第一篇打基础,第二篇学以致用,查缺补漏,第三篇是我认为的 Go 语言能打的部分:协程 的应用。 我对 Go 的理解没那么深,能让我一个小白对 Go 感兴趣,一是云原生工作需要,二就是它能轻易的调动协程。不然它还真不能把我的目光从 C++ 身上挪过去一点。

package mainimport ( "fmt" "sync")// 模拟订单对象type OrderInfo struct { id int}var num intvar wg sync.WaitGroup// 生产订单--生产者func producer(out chan<- OrderInfo) { // 业务生成订单 for i := 0; i < 10000; i++ { order := OrderInfo{id: i + 1} fmt.Println("生成订单,订单ID为:", order.id) out <- order // 写入channel } // 如果不关闭,消费者就会一直阻塞,等待读 close(out) // 订单生成完毕,关闭channel}func producerDispatch(tasks chan OrderInfo) { producer(tasks)}// 处理订单--消费者func consumer(i int, in <-chan OrderInfo) { defer wg.Done() // 从channel读取订单,并处理 for order := range in { fmt.Println("消费者", i, "读取订单,订单ID为:", order.id) num++ }}func main() { //消费者个数 var channelLen = 50 tasks := make(chan OrderInfo, channelLen) go producerDispatch(tasks) go consumer(1, tasks) wg.Add(1) go consumer(2, tasks) wg.Add(1) go consumer(3, tasks) wg.Add(1) go consumer(4, tasks) wg.Add(1) wg.Wait() //defer close(tasks) fmt.Println("all done") fmt.Println(num)}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Kubernetes 部署策略
下一篇:快手517吃货节引爆食品品牌营销,整合资源赋能品牌生意增长!(快手美食节)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~