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

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 语言入门三部曲:能用 Go 写“生产-消费者”模型相关的知识,希望对你有一定的参考价值。

文章目录

到最后一篇了,让我们再回顾一下这三篇的设定。
第一篇打基础,第二篇学以致用,查缺补漏,第三篇是我认为的 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 := OrderInfoid: 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)

以上是关于Go 语言入门三部曲:能用 Go 写“生产-消费者”模型的主要内容,如果未能解决你的问题,请参考以下文章

Go 语言入门三部曲:能看懂 Go 语言

go语言中实现生产者-消费者模式有哪些方法呢

Go语言协程并发---生产者消费者实例

基于go的生产者消费者模型

Go语言基准测试(benchmark)三部曲之二:内存篇

Go语言基准测试(benchmark)三部曲之三:提高篇