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對應作業系統程序 對...