goroutine 誤區(qū)

經(jīng)呈埽看到一些帖子,利用goroutine循環(huán)打印循環(huán)變量懂鸵,來check大家對goroutine的理解是否到位偏螺,同時有些帖子個人認為描述的不夠準確并存在異議之處,在這里分享下我的理解匆光。

首先說下goroutine的調(diào)度

1.G代表一個goroutine對象套像,每次go調(diào)用的時候,都會創(chuàng)建一個G對象

2.?M代表一個線程终息,每次創(chuàng)建一個M的時候夺巩,都會有一個底層線程創(chuàng)建;所有的G任務(wù)周崭,最終還是在M上執(zhí)行

3.?P代表一個處理器劲够,每一個運行的M都必須綁定一個P,就像線程必須在么一個CPU核上執(zhí)行一樣

下面說下循環(huán)打印例子:

func main() {

????????for i := 0; i < 100; i++ {

? ? ? ????? go fmt.Println(i)

? ? ????}

}

大家猜想下會輸出什么休傍?

答案1征绎、順序輸出1到100

答案2、亂序輸出1到100

答案3磨取、輸出100個100

答案4人柿、沒有任何輸出。

上面的例子很簡單忙厌。對于選擇1或者2的同學凫岖,可能就進入了出題人的陷阱了??,main函數(shù)很快執(zhí)行結(jié)束程序退出了逢净,甚至根本不給go協(xié)程調(diào)度執(zhí)行的機會哥放。標準答案應(yīng)該是4歼指。那什么情況下會是1、2或者3那甥雕?

首先想讓上面的程序正常有打印踩身,可以在main函數(shù)后面加個sleep,或者sync.WaitGroup機制社露,或者通過channel機制均可挟阻,這里不寫了,如果大家有興趣可以自己寫峭弟,如果寫不出來可單獨留言附鸽。實際上上面的程序1和2都有可能輸出,如上面的goroutine調(diào)度圖可知瞒瘸,取決于P(處理器核數(shù))坷备,如果是在多核上運行,不加任何處理,則輸出結(jié)果如下:

與答案2一致情臭,如果在程序里面增加runtime.GOMAXPROCS(1)省撑,則會順序輸出,與答案1一致谎柄。怎么做能夠輸出3的效果丁侄?答案也很簡單,如下程序即可:

runtime.GOMAXPROCS(1)

for i :=0; i <100; i++ {

????????go func() {

????????????????fmt.Println(i)

????????}()

}

此外看到一篇文章朝巫,里面舉了個例子鸿摇,如下:

func main() {

? ? for i := 0; i < 100; i++ {

? ? ? ? go func(i int) {

? ? ? ? ? ? fmt.Println(i)

? ? ? ? }(i)

? ? }

? ? time.sleep(2 * time.second)

}

簡單的說明這個程序會順序輸出1-100,這么說是不嚴謹?shù)呐常瑢εc單核或者設(shè)定runtime.GOMAXPROCS(1)選項是OK的拙吉,如果沒有指定,還是會亂序輸出的揪荣。

總結(jié)下筷黔,綜上所述,我們在表達一個結(jié)果或者一個一個結(jié)論的時候仗颈,切記把背景描述清楚佛舱。否則會誤人子弟,導(dǎo)致一個面試失敗~~??挨决。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末请祖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脖祈,更是在濱河造成了極大的恐慌肆捕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖高,死亡現(xiàn)場離奇詭異慎陵,居然都是意外死亡眼虱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門席纽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捏悬,“玉大人,你說我怎么就攤上這事胆筒∮势疲” “怎么了诈豌?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵仆救,是天一觀的道長。 經(jīng)常有香客問我矫渔,道長彤蔽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任庙洼,我火速辦了婚禮顿痪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘油够。我一直安慰自己蚁袭,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布石咬。 她就那樣靜靜地躺著揩悄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鬼悠。 梳的紋絲不亂的頭發(fā)上删性,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音焕窝,去河邊找鬼蹬挺。 笑死,一個胖子當著我的面吹牛它掂,可吹牛的內(nèi)容都是我干的巴帮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虐秋,長吁一口氣:“原來是場噩夢啊……” “哼榕茧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熟妓,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雪猪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后起愈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只恨,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡译仗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官觅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵菌。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖休涤,靈堂內(nèi)的尸體忽然破棺而出咱圆,到底是詐尸還是另有隱情,我是刑警寧澤功氨,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布序苏,位于F島的核電站,受9級特大地震影響捷凄,放射性物質(zhì)發(fā)生泄漏忱详。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一跺涤、第九天 我趴在偏房一處隱蔽的房頂上張望匈睁。 院中可真熱鬧,春花似錦桶错、人聲如沸航唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糯钙。三九已至,卻和暖如春黎比,著一層夾襖步出監(jiān)牢的瞬間超营,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工阅虫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留演闭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓颓帝,卻偏偏與公主長得像米碰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子购城,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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