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)
}
相关文章
|
2天前
|
Go
go语言的复数常量
【10月更文挑战第21天】
13 6
|
2天前
|
Go
go语言的浮点型常量
【10月更文挑战第21天】
9 4
|
2天前
|
编译器 Go
go语言的整型常量
【10月更文挑战第21天】
8 3
|
2天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
Java 编译器 Go
一起学Golang系列(五)初次接触Go语言可能遇到的各种坑!
前面介绍了Go语言的基础语法,所谓磨刀不误砍柴工,希望大家还是能熟悉掌握这些基础知识,这样后面真正学起Go来才会得心应手。 作为初学者。Go语言的语法有些和java类似,但也有很多不一样的地方。刚开始都会遇到各种各样的坑。下面就来总结下学习go语言的过程中,遇到的各种坑。
一起学Golang系列(五)初次接触Go语言可能遇到的各种坑!
|
3天前
|
安全 网络协议 Go
Go语言网络编程
【10月更文挑战第28天】Go语言网络编程
89 65
|
3天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
23 13
|
3天前
|
网络协议 安全 Go
Go语言的网络编程基础
【10月更文挑战第28天】Go语言的网络编程基础
17 8
|
3天前
|
Go
go语言编译时常量表达式
【10月更文挑战第20天】
11 3
|
3天前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
10 2