生产者与消费者的并发处理

版权声明:版权归作者所有 https://blog.csdn.net/qq_36772866/article/details/82936762
package main

import "fmt"
import "math/rand"
import "time"

// producer
func producer(header string, channel chan<- string){
    for{
        channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
        time.Sleep(time.Second)
    }
}

// customer
func customer(channel <- chan string){
    for{
        message:= <-channel
        fmt.Println(message)
    }
}

func main() {
    fmt.Printf("%s\n", "hello world")
    channel := make(chan string)
    
    go producer("cat", channel)
    go producer("dog", channel)
    
    customer(channel)
}

代码说明

第3行 导入格式化函数(fmt),随机数(math/rand),时间(time)包参与编译
第10行 生产函数,闯入一个标记类型的字符串以及一个只能写入的通道
第13行 for{}构成一个无限循环
第15行 使用rand.Int31()生成一个随机数,使用fmt.Sprintf()函数格式化
第18行 使用time.Sleep()函数执行暂停1s再执行这个函数,如果goroutine中执行时,暂停不会影响其他goroutine
第23行 消费者函数,传入一个只能写入的通道
第26行 构成一个无限循环
第28行 从通道中取出数据
第31行 将取出来的数据进行打印
第35行 程序入口函数
第37行 实例化一个字符串类型的通道
第39行和第40行 并发执行一个生产者函数,两行分别创建了这个函数搭配不同参数的两个goroutine
第42行 执行消费者函数通过通道进行数据消费

运行结果如下

在这里插入图片描述

如何理解通道 channel

其实有点像那个水龙头的水和水管差不多

生产者就是一头的水

通道就是一根水管负责把水传输到另一边

消费者就是相当我们平时用水一样需要用桶子把水装起来一样
在这里插入图片描述

有兴趣可以加入QQ讨论群 901714867

在这里附上 在线编译go语言的平台

go语言在线编程,go代码在线测试,在线调试工具网站

猜你喜欢

转载自blog.csdn.net/qq_36772866/article/details/82936762