Golang併發 goroutine和通道

2021-10-23 07:00:05 字數 2098 閱讀 5068

goroutine 和通道(channel)實現的通訊順序程序(csp)模式

共享記憶體多執行緒模式

goroutine

goroutine指每乙個併發執行的活動。main函式在主goroutine中執行。goroutine通過go關鍵字建立。

gof(

)// 新建乙個goroutine呼叫f(),go語句本身立即返回

main函式返回時,所有goroutine直接終結,程式退出。除此之外,乙個goroutine不能直接停止另乙個goroutine,但可以發訊號通知它自己停止。

通道goroutine之間通過通道傳送資料。通道是乙個有具體型別(稱作元素型別)的導管,比如元素型別為int的通道寫作 chan int。

建立通道

ch =

make

(chan

int)

// 建立通道,ch 的型別是 chan int,為引用型別

通道操作

ch <-

3// 傳送3

x =<-ch // 接受,x=3

ch <-

5// 傳送5

close

(ch)

// 關閉通道,關閉後的傳送會導致宕機,多次關閉也會宕機

x =<-ch // 關閉後繼續接受已傳送的值,x=5

x =<-ch // 通道為空且已關閉,每次接受都立即返回對應型別的零值

x, ok :=

<-ch // 返回通道元素和乙個布林值,false表示關閉且讀完

緩衝

ch =

make

(chan

int)

// 無緩衝通道

ch =

make

(chan

int,0)

// 無緩衝通道

ch =

make

(chan

int,3)

// 緩衝為3的通道

cap(ch)

// 獲取緩衝區容量

len(ch)

// 獲取通道內元素個數

無緩衝通道

先執行傳送會阻塞,直到另乙個goroutine接受。

先執行接受也會阻塞,直到另乙個goroutine傳送。

也稱為同步通道

緩衝通道

通道滿了,再傳送會阻塞

通道內無元素時,再接受會阻塞

管道(pipeline)

通道連線goroutine,乙個的輸入是另乙個的輸出,稱作管道。

單向通道

ch :=

make

(chan

int,1)

var in <-

chan

int= ch // 只能從in接受資料

var out chan

<-

int= ch // 只能傳送資料到out

out <-

10 i :=

<-in

select 多路復用

和switch類似,有多個情況和乙個default分支,每個情況指定一次通訊(在通道上傳送或接收)和關聯的**塊。若多個情況都可以執行,隨機選擇乙個,若都不能執行,則執行default,沒有default則select將一直阻塞。

ch :=

make

(chan

int,2)

for}

輸出:

send 5

send 5

receive a

receive b

send 5

send 5

receive b

receive b

send 5

receive 5

send 5

……

golang 閒談併發

對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...

golang 併發實踐

golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...

GoLang 併發小結

006.併發 1 概念 1.1 goroutine是go並行設計的核心,goroutine的本質是輕量級執行緒 1.2 golang的runtime實現了對輕量級執行緒即goroutine的智慧型排程管理 1.3 p m g原理 1.3.1 runtime有p m g三個概念,p對應作業系統程序 對...