Go并發(fā)編程小貼士

一、死鎖陷阱

關(guān)于Go的并發(fā)編程,你會遇到哪些陷阱:

  • 主協(xié)程退出時洁仗,所有子協(xié)程都一并退出;
  • 所有子協(xié)程都已經(jīng)完成工作性锭,但主協(xié)程和一些工作協(xié)程還存活赠潦,這是由于主協(xié)程無法獲得工作協(xié)程的完成狀態(tài);
  • 多個不同的協(xié)程都鎖定了受保護(hù)的資源而且同時嘗試去獲得對方資源的時候草冈,即死鎖她奥。

以上陷阱的主要緣由是主協(xié)程不知道子協(xié)程的工作狀態(tài)和結(jié)果
常見解決方案:

  • 簡約方法:讓主協(xié)程在一個done 通道上等待,根據(jù)接收到的通道信息判斷工作是否完成怎棱。
  • 等待組方法:使用sync.WaitGroup讓每個工作協(xié)程報告自己的完成狀態(tài)哩俭。

值得注意的是,無論是簡約方法拳恋,還是等待組方法凡资,都有可能產(chǎn)生死鎖:

  • 等待組是當(dāng)所有工作協(xié)程都處于鎖定狀態(tài)時(等待接收通道數(shù)據(jù))調(diào)用sync.WaitGroup.Wait()會產(chǎn)生死鎖。
  • 假如有若干個協(xié)程可以互相通知對方去執(zhí)行某個函數(shù)(向?qū)Ψ桨l(fā)送一個請求)谬运,如果這些請求執(zhí)行的函數(shù)中有一個函數(shù)向執(zhí)行它的調(diào)用者協(xié)程發(fā)送一些數(shù)據(jù)隙赁,那就會發(fā)生死鎖。

二梆暖、善用通道

通道為并發(fā)運行的協(xié)程之間提供了一種無鎖通信方式(無人工加解鎖)伞访,當(dāng)通道有數(shù)據(jù)傳輸時,發(fā)送和接收的協(xié)程都處于同步狀態(tài)轰驳。

通道使用經(jīng)驗1:默認(rèn)情況下厚掷,通道是雙向的,但我們通常在使用通道時级解,通道變量是作為參數(shù)傳遞的冒黑,在通信的另一個協(xié)程里我們往往希望它單向使用該通道,要么只發(fā)送( ch<- data)蠕趁,要么只接收( data:= <-ch) 薛闪,所以我們往往在聲明函數(shù)的通道參數(shù)時先指定通道方向辛馆,以規(guī)范協(xié)程函數(shù)內(nèi)的通道使用俺陋,函數(shù)參數(shù)聲明單向通道會提供額外的編譯器檢查,開發(fā)時我們應(yīng)該有這種編程習(xí)慣昙篙。

通道使用經(jīng)驗2:只有在后面要檢查通道是否關(guān)閉的時候才需要顯式的關(guān)閉通道腊状。
例如:在一個for ... range.. 循環(huán)里,或者select通道多路復(fù)用里苔可,或者使用<-操作符來檢查是否可以接收等情況缴挖,需要顯式關(guān)閉通道。
通道非常輕量焚辅,對系統(tǒng)資源的消耗可忽略不計映屋,簡而言之苟鸯,有檢查通道關(guān)閉狀態(tài)需要的情況下,才會去在發(fā)送端顯式關(guān)閉通道棚点,以上經(jīng)驗可應(yīng)付大部分場景早处,如有特殊需求可具體情況具體分析。

通道使用經(jīng)驗3:應(yīng)該由發(fā)送端的協(xié)程關(guān)閉通道瘫析,而不是接收端去關(guān)閉砌梆。

三、并發(fā)安全

通常贬循,通道傳輸值類型(如struct咸包、數(shù)組、布爾值杖虾、整型烂瘫、浮點型、甚至字符串)都是安全的亏掀,因為它們都是拷貝傳輸忱反,也就是說并發(fā)訪問相同的值也沒有風(fēng)險。那么你也可以想到通道傳輸指針類型和引用類型不能保證數(shù)據(jù)安全滤愕,因為任何得到指針類型或引用類型的變量的協(xié)程都可以修改數(shù)據(jù)温算,所以當(dāng)涉及指針和引用時我們必須保證這些變量在任何時候只能被一個協(xié)程訪問得到,建議指針和引用(甚至可寫接口類型)的值訪問串行進(jìn)行间影。

如何安全的并發(fā)訪問指針或引用變量:

  • 方法一:使用同步鎖sync.Mutex注竿,這非常好理解,一個數(shù)據(jù)只允許一個協(xié)程獨占使用魂贬,當(dāng)其他協(xié)程也需要訪問時只能等待巩割;
  • 方法二:設(shè)定規(guī)則,編碼自律付燥,即一旦指針或引用被發(fā)送后發(fā)送方不再訪問它宣谈,然后接收方訪問并在之后釋放指針和引用指向的值;
  • 方法三:讓所有導(dǎo)出的方法不能修改該值键科,所有可修改值的方法都不引出闻丑,這樣外部可以引出這些方法進(jìn)行并發(fā)訪問,但內(nèi)部只允許一個協(xié)程取訪問它的非導(dǎo)出方法勋颖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗦嗡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饭玲,更是在濱河造成了極大的恐慌侥祭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矮冬,居然都是意外死亡谈宛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門胎署,熙熙樓的掌柜王于貴愁眉苦臉地迎上來入挣,“玉大人,你說我怎么就攤上這事硝拧【斗ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵障陶,是天一觀的道長滋恬。 經(jīng)常有香客問我,道長抱究,這世上最難降的妖魔是什么恢氯? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鼓寺,結(jié)果婚禮上勋拟,老公的妹妹穿的比我還像新娘。我一直安慰自己妈候,他們只是感情好敢靡,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苦银,像睡著了一般啸胧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幔虏,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天纺念,我揣著相機與錄音,去河邊找鬼想括。 笑死陷谱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑟蜈。 我是一名探鬼主播烟逊,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踪栋!你這毒婦竟也來了焙格?” 一聲冷哼從身側(cè)響起图毕,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夷都,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囤官,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡冬阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了党饮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝陪。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刑顺,靈堂內(nèi)的尸體忽然破棺而出氯窍,到底是詐尸還是另有隱情,我是刑警寧澤蹲堂,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布狼讨,位于F島的核電站,受9級特大地震影響柒竞,放射性物質(zhì)發(fā)生泄漏政供。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一朽基、第九天 我趴在偏房一處隱蔽的房頂上張望布隔。 院中可真熱鬧,春花似錦稼虎、人聲如沸衅檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽术吝。三九已至,卻和暖如春茸苇,著一層夾襖步出監(jiān)牢的瞬間排苍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工学密, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淘衙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓腻暮,卻偏偏與公主長得像彤守,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哭靖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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