1. 程式人生 > >go語言實現生產者-消費者

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)
}