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

前言:

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

其实很简单嘛,生产者生产,消费者进行消费,就是如此简单。了解了一下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)
}

  

原文地址:https://www.cnblogs.com/qstudy/p/10190448.html