go语言实现生产者-消费者

时间:2024-01-14 10:51:14

前言:

之前在学习操作系统的时候,就知道生产者-消费者,但是概念是模模糊糊的,好像是一直没搞明白。

其实很简单嘛,生产者生产,消费者进行消费,就是如此简单。了解了一下go语言的goroute,感觉实现并发原来可以如此简单,不像之前Java,什么还需要什么线程池啥的。

1、其实可以在一个go文件中可以实现的,按照go语言的开发习惯,按照标准的,定义三个包producer,consumer,main

2、producer.go

生产者每一秒产生一个header,一个随机数,并将它输出到管道pipe中。

package producer

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

3、consumer.go

消费者从管道拿到数据,并进行输出。

package consumer

import("fmt")

func Consume(pipe chan string){
for{
message := <- pipe
fmt.Println(message)
} }

4、main.go

a、main是可执行的入口,并且得有个main函数,make用于定义一个管道,供生产者写入,消费者读数据

b、在这么简答的例子中,我们用到了go得并发特性,go是关键字,用于启动一个goroute,下面的main函数中,启动了两个producer的goroute生产数据,consumer利用main函数的goroute进行消费,在main开始执行后,他们是并发执行的。

package main

import(
"consumer"
“producer"
) func main(){
channel := make(chan string)
go producer.Produce("dog",channel)
go producer.Produce("cat",channel)
consumer.Consume(channel)
}