Golang 入門系列(十七)幾個常見的併發模型——生產者消費者模型

前面已經講過不少Golang系列知識,包括併發,鎖等內容,感興趣的能夠看看之前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.htmlhtml

接下來說幾個golang常見的併發模型,今天先說說生產者消費者模型。golang

 

生產者消費者模型

 

生產者:發送數據端緩存

消費者:接收數據端安全

緩衝區:
  1. 解耦(下降生產者和消費者之間耦合度)併發

  2. 併發(生產者消費者數量不對等時,能保持正常通訊)函數

  3. 緩存(生產者和消費者 數據處理速度不一致時,暫存數據)spa

 

如何實現?

生產者消費者模型是很是常見的併發模型,並且golang提供了chan類型,能夠很方便的實現。指針

根據 golang的官方文檔,使用chan就能夠實現生產者和消費者之間的數據和狀態同步。code

  • 經過chan在生產者和消費者之間傳遞數據(ch)和同步狀態(done);
  • chan做爲參數傳遞時是引用傳遞,不須要使用指針;
  • chan是協程安全的,多個goroutine之間不須要鎖;
  • chan的close事件能夠被recv獲取,close事件必定在正常數據讀完以後,機制相似於read到EOF;
示例代碼:

package main

import "fmt"

func Producer(ch chan int) {
  for i := 1; i <= 10; i++ {
    ch <- i
  }
  close(ch)
}

func Consumer(id int, ch chan int, done chan bool) {
  for {
    value, ok := <-ch
    if ok {
      fmt.Printf("id: %d, recv: %d\n", id, value)
    } else {
      fmt.Printf("id: %d, closed\n", id)
      break
    }
  }
  done <- true
}

func main() {
  ch := make(chan int, 3)

  coNum := 2
  done := make(chan bool, coNum)
  for i := 1; i <= coNum; i++ {
    go Consumer(i, ch, done)
  }

  go Producer(ch)

  for i := 1; i <= coNum; i++ {
    <-done
  }
}orm


運行結果:
id: 2, recv: 1
id: 1, recv: 2
id: 1, recv: 4
id: 1, recv: 5
id: 1, recv: 6
id: 2, recv: 3
id: 2, recv: 8
id: 2, recv: 9
id: 2, recv: 10
id: 2, closed
id: 1, recv: 7
id: 1, closed

 

簡單說明:

一、首先建立一個雙向的channel,

2.、而後開啓一個新的goroutine,把雙向通道做爲參數傳遞到producer方法中,同時轉成只寫通道。子協程開始執行循環,向只寫通道中添加數據,這就是生產者。

三、主協程,直接調用consumer方法,該方法將雙向通道轉成只讀通道,經過循環每次從通道中讀取數據,這就是消費者。


注意:channel做爲參數傳遞,是引用傳遞。

 

緩衝區的好處

1:解耦
假設生產者和消費者分別是兩個類。若是讓生產者直接調用消費者的某個方法,那麼生產者對於消費者就會產生依賴(也就是耦合)。未來若是消費者的代碼發生變化,可能會直接影響到生產者。而若是二者都依賴於某個緩衝區,二者之間不直接依賴,耦合度也就相應下降了。

2:處理併發
生產者直接調用消費者的某個方法,還有另外一個弊端。因爲函數調用是同步的(或者叫阻塞的),在消費者的方法沒有返回以前,生產者只好一直等在那邊。萬一消費者處理數據很慢,生產者只能無故浪費時間。
使用了生產者/消費者模式以後,生產者和消費者能夠是兩個獨立的併發主體。生產者把製造出來的數據往緩衝區一丟,就能夠再去生產下一個數據。基本上不用依賴消費者的處理速度。
其實最當初這個生產者消費者模式,主要就是用來處理併發問題的。

3:緩存
若是生產者製造數據的速度時快時慢,緩衝區的好處就體現出來了。當數據製造快的時候,消費者來不及處理,未處理的數據能夠暫時存在緩衝區中。等生產者的製造速度慢下來,消費者再慢慢處理掉。

 

最後

以上,就把golang生產者消費者模型簡單介紹完了,但願能對你們有所幫助。

相關文章
相關標籤/搜索