使用 Python對接快遞單號識別查詢api接口查詢物流信息
934
2025-04-01
Golang:再談生產者消費者模型
那假如我們想生產完了之后在一次性消費呢?怎么實現?那我們就出現了調度的情形。消費者等生產者生產完畢的信號,只有生產者給消費者發送信號,消費者才能消費,不然消費者一直阻塞。
主函數
我們先來看看主函數:
func main() { chanShop := make(chan string,10) chanTel := make(chan int) go Producer(chanShop,chanTel) go Consumer(chanShop,chanTel) for { time.Sleep(time.Second) } }
chanTel沒有緩存能力,我們之前說的,如果不往里寫,那根本就不能讀。所以被阻塞的那條消費者協程在讀取前幾乎不占用資源。
生產者協程
再來看看生產者協程:
func Producer(chanShop chan string,chanTel chan int) { runtime.GOMAXPROCS(2) for i:=0;i<10;i++ { product := strconv.Itoa(time.Now().Nanosecond()) chanShop <- "產品"+product fmt.Println("生產了產品",product) time.Sleep(time.Second) } close(chanShop) fmt.Println("生產完畢") chanTel <- 123456789 fmt.Println(123456789,"呼出電話") }
生產10個商品,生產完畢之后,就開始打電話,給消費者協程打電話。生產者協程給chanTel寫入東西,阻塞的消費者協程立刻就通順了,來看看消費者協程的內容吧!
消費者協程
func Consumer(chanShop chan string,chanTel chan int) { runtime.GOMAXPROCS(1) tel := <- chanTel fmt.Println("收到來電",tel) for product := range chanShop{ fmt.Println("消費了產品",product) } fmt.Println("消費完畢") }
消費者調用單核處理消費。當收到來電時,該協程就不阻塞了,馬上消費產品!
看了上面的例子,你可能還會疑惑什么是生產者消費者問題,最后我們再來了解了解吧!
什么是生產者消費者問題
根據維基百科,生產者消費者問題是這樣介紹的:
生產者消費者問題(英語:Producer-consumer problem),也稱有限緩沖問題(Bounded-buffer problem),是一個多進程同步問題的經典案例。該問題描述了共享固定大小緩沖區的兩個進程——即所謂的“生產者”和“消費者”——在實際運行時會發生的問題。生產者的主要作用是生成一定量的數據放到緩沖區中,然后重復此過程。與此同時,消費者也在緩沖區消耗這些數據。該問題的關鍵就是要保證生產者不會在緩沖區滿時加入數據,消費者也不會在緩沖區中空時消耗數據。
我們這段代碼只是簡單的描述這個問題,在寫入緩沖區完畢后,緩沖區大小為10,我們就寫入10個,然后就馬上關閉chanShop,關閉后消費者協程就不會一直讀而導致在緩沖區中空時嘗試讀取數據。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。