Golang channel

本文介紹golang的channel的基礎(chǔ)知識和一些經(jīng)典的應(yīng)用范式.

channel 基礎(chǔ)

channel分類

  • buffered/unbuffered channel

按這個標準channel可以分為兩個大類:帶緩沖(buffered)的channel和不帶緩沖(unbuffered)的channel. 定義一個不帶緩的channel

var ch = make(chan bool)

下面這段代碼會輸出什么呼奢?

package main

func main(){
  ch :=make(chan int)
  ch <-10
  go task(ch)
}
func task(ch chan int){
   <- ch
}

答案是會死鎖。因為unbuffered channel在寫入數(shù)據(jù)之前需要有接收channle數(shù)據(jù)的goroutine做好準備握础。需要對上面代碼做如下修改:

package main

func main(){
  ch :=make(chan int)
  go task(ch)
  ch <-10
}
func task(ch chan int){
   <- ch
}

帶有緩沖的channel

var ch = make(chan bool, 3)
  • unidirectoinal/bidirectional channel

定義一個雙向(bidirectional)channel

var ch = make(chan bool)

雙向的意思是可以在channel上讀或者寫. 定義一個單向只讀channel

var ch = make(<- chan bool)

定義一個單向只寫channel

var ch = make(chan <- bool)

channel的狀態(tài)

對處于不同狀態(tài)的channel的讀寫操作會有不同的結(jié)果

  • nil

對nil狀態(tài)的channel讀寫都會被阻塞,造成死鎖禀综。

  • open

對正常open狀態(tài)的channel可以進行正常讀寫。

  • closed

往closed狀態(tài)的channel寫數(shù)據(jù)會造成panic菇存,但是讀取不會造成panic夸研,會得到channel類型的零值依鸥。

channel的實現(xiàn)原理

實現(xiàn)channel的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

 type hchan struct {
    qcount   uint           // total data in the queue
    dataqsiz uint           // size of the circular queue
    buf      unsafe.Pointer // points to an array of dataqsiz elements
    elemsize uint16
    closed   uint32
    elemtype *_type // element type
    sendx    uint   // send index
    recvx    uint   // receive index
    recvq    waitq  // list of recv waiters
    sendq    waitq  // list of send waiters

    // lock protects all fields in hchan, as well as several
    // fields in sudogs blocked on this channel.
    //
    // Do not change another G's status while holding this lock
    // (in particular, do not ready a G), as this can deadlock
    // with stack shrinking.
    lock mutex
}

channel里包含一個環(huán)形隊列,用于將goroutine發(fā)送的數(shù)據(jù)保存到隊列中贱迟。另外 recvqsendq 隊列用于保存阻塞在讀和寫操作的goroutine. 當(dāng)channel中有數(shù)據(jù)可讀或可寫時,調(diào)度器喚醒阻塞在相應(yīng)隊列中的goroutine.

channle常用的應(yīng)用范式

  1. 生產(chǎn)者消費者模式
  2. 一對多和多對一的通知
  3. 互斥鎖
  4. ratelimiting
  5. 限制并發(fā)數(shù)
  6. 配合select超時控制

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣吠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缚俏,更是在濱河造成了極大的恐慌惊搏,老刑警劉巖忧换,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亚茬,居然都是意外死亡,警方通過查閱死者的電腦和手機刹缝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門颈将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人言疗,你說我怎么就攤上這事≡胙伲” “怎么了疑务?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵知允,是天一觀的道長。 經(jīng)常有香客問我叙谨,道長,這世上最難降的妖魔是什么手负? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任涤垫,我火速辦了婚禮竟终,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘统捶。我一直安慰自己榆芦,他們只是感情好喘鸟,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著什黑,像睡著了一般崎淳。 火紅的嫁衣襯著肌膚如雪愕把。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天恨豁,我揣著相機與錄音,去河邊找鬼圣絮。 笑死祈惶,一個胖子當(dāng)著我的面吹牛扮匠,可吹牛的內(nèi)容都是我干的捧请。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼疹蛉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了力麸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤克蚂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后埃叭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摸恍,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡赤屋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了类早。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚媒。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡缭召,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逆日,到底是詐尸還是另有隱情恼琼,我是刑警寧澤屏富,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站狠半,受9級特大地震影響噩死,放射性物質(zhì)發(fā)生泄漏神年。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一已日、第九天 我趴在偏房一處隱蔽的房頂上張望垛耳。 院中可真熱鬧,春花似錦栈雳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痴奏。三九已至蛀骇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擅憔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工檐晕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棉姐。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像伞矩,于是被迫代替她去往敵國和親笛洛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • channel[通道]是golang的一種重要特性苛让,正是因為channel的存在才使得golang不同于其它語言。...
    碼洞閱讀 22,442評論 1 53
  • Chapter 8 Goroutines and Channels Go enable two styles of...
    SongLiang閱讀 1,581評論 0 3
  • 通過消息來共享數(shù)據(jù)是golang的一種設(shè)計哲學(xué)狱杰,channel則是這種哲理的體現(xiàn).channel定義 dataTy...
    大漠狼道閱讀 7,635評論 0 8
  • 某次面試面試官問了個很好的問題,可惜自己當(dāng)時不了解仿畸,下面仔細分情況試一下。抽空看下golang里關(guān)于channel...
    wncbbnk閱讀 1,070評論 0 1
  • 生產(chǎn)者消費者問題是一個著名的線程同步問題朗和,該問題描述如下:有一個生產(chǎn)者在生產(chǎn)產(chǎn)品,這些產(chǎn)品將提供給若干個消費者去消...
    zengfan閱讀 5,981評論 0 4