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

简介:

@[toc]

到最后一篇了,让我们再回顾一下这三篇的设定。
第一篇打基础,第二篇学以致用,查缺补漏,第三篇是我认为的 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)
}
相关文章
|
7天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
17 1
|
6天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
7天前
|
Go
go语言创建字典
go语言创建字典
|
7天前
|
Go
Go 语言接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
|
5月前
|
开发框架 安全 中间件
Go语言开发小技巧&易错点100例(十二)
Go语言开发小技巧&易错点100例(十二)
65 1
|
2月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
2月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
2月前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
4月前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
4月前
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
下一篇
无影云桌面