Go的併發沒有它,就像iphone沒有網路一樣

flynike發表於2021-09-09

Go的併發沒有它,就像iphone沒有網路一樣

圖片描述

簡介

Golang的併發屬性是該語言的一個大殺器,說到併發就不能不提Channel,你可以把它看成一個管道,透過它併發核心單元就可以傳送或者接收資料進行通訊。這篇文章來深入瞭解一下 channel。

channel 的設計是基於 CSP 模型的。CSP 是 Communicating Sequential Process 的簡稱,中文可以叫做通訊順序程式,是一種併發程式設計模型,由 於 1977 年提出。簡單來說,CSP 模型由併發執行的實體(執行緒或者程式)所組成,實體之間透過傳送訊息進行通訊,這裡傳送訊息時使用的就是通道,或者叫 channel。CSP 模型的關鍵是關注 channel,而不關注傳送訊息的實體。Go 語言實現了 CSP 部分理論,goroutine 對應 CSP 中併發執行的實體,channel 也就對應著 CSP 中的 channel。

建立Channel

  • Go中的Channel使用chan作為關鍵字。

  • 無緩衝chan情況下,傳送和接收會一直阻塞著,直到另一方準備好。這種方式可以用來在gororutine中進行同步,- 而需要使用鎖或者條件變數。

  • 有緩衝chan,可以儘量避免阻塞,提高應用的效能,典型的以時間換空間。

aChan := make(chan int)  // 建立無緩衝chanbChan := make(chan int, N) // 建立緩衝為N的chan

賦值和取值

從以下程式碼中看不出它的巨大作用,很正常,那是因為他們兩條語句通常不在一起,例如:協程A傳送資料,協程B接收資料

mchan 

Select

Selsect是獲取Channel中資料的最常用方式。

select 一定程度上可以類比於 linux 中的 IO 多路複用中的 select。後者相當於提供了對多個 IO 事件的統一管理,而 Golang 中的 select 相當於提供了對多個 channel 的統一管理。當然這只是 select 在 channel 上的一種使用方法。

func main(){

    ch1 := make(chan int, 1)

    ch2 := make(chan int, 1)

    select {        case e1 := 

for...range

for …… range語句可以處理Channel。

    go func() {

        time.Sleep(1 * time.Hour)

    }()

    c := make(chan int)    go func() {        for i := 0; i 

timeout

Select很重要的一個應用就是超時處理。 因為上面提供的demo,select語句就會一直阻塞著。這時候我們可能就需要一個超時操作,用來處理超時的情況。下面這個例子我們會在2秒後往channel c1中傳送一個資料,但是Select設定為1秒超時,因此我們會列印出timeout 1,而不是result 1。

    c1 := make(chan string, 1)

    go func() {

        time.Sleep(time.Second * 2)

        c1 

close

Go內建的close方法就可以用來關閉channel。但如果channel 已經被關閉,繼續往它傳送資料會導致panic: send on closed channel:

close(mChan)

推薦閱讀



作者:freelang
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2804994/,如需轉載,請註明出處,否則將追究法律責任。

相關文章