Goroutine和Channel總結(jié)

Golang對并發(fā)的支持相對簡單囱挑,采用的是Goroutine的機(jī)制酱床,類似于協(xié)程腹殿。

采用Go關(guān)鍵字就能實(shí)現(xiàn)旨枯。

Goroutine 基礎(chǔ)

第一種情況

func main() {
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println(i)

        }(i)
    }
}

猜猜以上代碼的輸出蹬昌,結(jié)果是什么都不輸出。
為什么呢攀隔,明明我用go開啟了10個并發(fā)協(xié)程為什么什么都不輸出呢皂贩?

原因:當(dāng)走完for循環(huán)的時候栖榨,main方法就結(jié)束了。這個時候 程序就會釋放所有資源明刷。所以go創(chuàng)建的并發(fā)func并不會執(zhí)行婴栽。

第二種情況

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func(i int) {
            defer wg.Done()
            fmt.Println(i)

        }(i)
    }
    wg.Wait()
}

先介紹一下sync.WaitGroup,點(diǎn)開可以看文檔辈末。

wg.Add(delta int)方法就是來設(shè)定應(yīng)等待的線程的數(shù)量愚争。
wg.Done() Done方法減少WaitGroup計(jì)數(shù)器的值,應(yīng)在線程的最后執(zhí)行挤聘。
wg.Wait() Wait方法阻塞直到WaitGroup計(jì)數(shù)器減為0轰枝。

這樣寫的目的就是讓main方法阻塞。
那么輸出的話就會很隨機(jī)组去,因?yàn)槟阋膊恢滥膫€線程會先跑完鞍陨。

附加runtime方法

func main() {
    runtime.GOMAXPROCS(2)
    wg := new(sync.WaitGroup)
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func(i int) {
            defer wg.Done()
            if i == 3 {
                runtime.Goexit()
            }
            fmt.Println(i)

        }(i)
    }
    wg.Wait()
}

GOMAXPROCS 文檔
Goexit 文檔

runtime.GOMAXPROCS(2) OMAXPROCS設(shè)置可同時執(zhí)行的最大CPU數(shù),來實(shí)現(xiàn)多核多線程并行添怔。
runtime.Goexit() Goexit終止調(diào)用它的go程湾戳。其它go程不會受影響。Goexit會在終止該go程前執(zhí)行所有defer的函數(shù)广料。

Goroutine通信 --> Channel

Channel的設(shè)計(jì)為了實(shí)現(xiàn)Goruntine直接的通信砾脑。值得一提的是Channel是值類型,這點(diǎn)需要注意艾杏。

//創(chuàng)建
chan = make(chan int)
使用channel在倆goroutine間傳遞消息
func main() {
    runtime.GOMAXPROCS(4)
    ch := make(chan int)
    go add(1, 2, ch)
    go printAaddB(ch)
}

func add(a int, b int, ch chan int) {
    ch <- a + b
}

func printAaddB(ch chan int) {
    fmt.Println(<-ch)
}

這樣便實(shí)現(xiàn)了chennel傳遞消息韧衣。

參考

以上內(nèi)容如有錯誤,請指出购桑。

Go 學(xué)習(xí)筆記 第四版 雨痕
Go 中文文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畅铭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勃蜘,更是在濱河造成了極大的恐慌硕噩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缭贡,死亡現(xiàn)場離奇詭異炉擅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阳惹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門谍失,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莹汤,你說我怎么就攤上這事快鱼。” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵抹竹,是天一觀的道長线罕。 經(jīng)常有香客問我,道長柒莉,這世上最難降的妖魔是什么闻坚? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮兢孝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仅偎。我一直安慰自己跨蟹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布橘沥。 她就那樣靜靜地躺著窗轩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座咆。 梳的紋絲不亂的頭發(fā)上痢艺,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音介陶,去河邊找鬼堤舒。 笑死,一個胖子當(dāng)著我的面吹牛哺呜,可吹牛的內(nèi)容都是我干的舌缤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼某残,長吁一口氣:“原來是場噩夢啊……” “哼国撵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玻墅,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤介牙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澳厢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體环础,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年赏酥,在試婚紗的時候發(fā)現(xiàn)自己被綠了喳整。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡裸扶,死狀恐怖框都,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤魏保,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布熬尺,位于F島的核電站,受9級特大地震影響谓罗,放射性物質(zhì)發(fā)生泄漏粱哼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一檩咱、第九天 我趴在偏房一處隱蔽的房頂上張望揭措。 院中可真熱鬧,春花似錦刻蚯、人聲如沸绊含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躬充。三九已至,卻和暖如春讨便,著一層夾襖步出監(jiān)牢的瞬間充甚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工霸褒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伴找,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓傲霸,卻偏偏與公主長得像疆瑰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昙啄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • Goroutine是Go里的一種輕量級線程——協(xié)程穆役。相對線程,協(xié)程的優(yōu)勢就在于它非常輕量級梳凛,進(jìn)行上下文切換的代價非...
    witchiman閱讀 4,820評論 0 9
  • 原文鏈接:https://github.com/EasyKotlin 在常用的并發(fā)模型中耿币,多進(jìn)程、多線程韧拒、分布式是...
    JackChen1024閱讀 10,712評論 3 23
  • 多進(jìn)程/線程 最早的服務(wù)器端程序都是通過多進(jìn)程淹接、多線程來解決并發(fā)IO的問題。進(jìn)程模型出現(xiàn)的最早叛溢,從Unix 系統(tǒng)誕...
    Newt0n閱讀 15,248評論 9 69
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理塑悼,服務(wù)發(fā)現(xiàn),斷路器楷掉,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 能力模型 選擇題 [primary] 下面屬于關(guān)鍵字的是()A. funcB. defC. structD. cl...
    _張曉龍_閱讀 24,808評論 14 224