Go 语言入门三部曲(三):能用 Go 写“生产-消费者”模型
2023-09-14 09:15:26 时间
文章目录
到最后一篇了,让我们再回顾一下这三篇的设定。
第一篇打基础,第二篇学以致用,查缺补漏,第三篇是我认为的 Go 语言能打的部分:协程 的应用。
我对 Go 的理解没那么深,能让我一个小白对 Go 感兴趣,一是云原生工作需要,二就是它能轻易的调动协程。不然它还真不能把我的目光从 C++ 身上挪过去一点。
package main
import (
"fmt"
"sync"
)
// 模拟订单对象
type OrderInfo struct {
id int
}
var num int
var 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)
}
相关文章
- 24.Go语言-Gin参数获取总结
- Go语言垃圾回收机制剖析
- 【Go】sync.atomic
- GoLang9 - Go语言函数
- 使用Go语言调用OpenAI API
- Go语言中常见100问题-#16 Not using linters
- 「Go工具箱」一个简单、易用的多错误管理包:go-multierror
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- 2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。
- Go语言nil:空值/零值
- Go语言输出九九乘法表
- Go语言圣经-Panic异常,Recover捕获异常习题详解编程语言
- Go语言圣经-WEB服务与习题详解编程语言
- Go语言—小白入门-命令行库Cobra的使用详解编程语言
- Go语言定时器实现原理及作用
- Go语言Dial()函数:建立网络连接
- 编程新精英:Go语言 Redis开发(go语言redis开发)
- Go 1.12 正式版发布,初步支持 TLS 1.3
- 关于go语言接入爬虫代理的代码demo
- MySQL中使用Go语言的好处(mysql中go什么)
- 部署Go语言快速连接Oracle实现轻松部署(go连接oracle简单)
- 数据库Go语言连接Oracle数据库的指南(go如何连接oracle)
- 学习Oracle Go了解信息技术世界(oracle go的用法)