go語言實現生產者-消費者
阿新 • • 發佈:2018-12-28
前言:
之前在學習作業系統的時候,就知道生產者-消費者,但是概念是模模糊糊的,好像是一直沒搞明白。
其實很簡單嘛,生產者生產,消費者進行消費,就是如此簡單。瞭解了一下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) }