goroutine 并發(fā)常見問題實踐

程序退出時運行的 goroutine 會不會被終止

測試代碼:

import (
    "time"
    "fmt"
)

func main() {
    for i := 0; i < 10; i ++ {
        go func(j int) {
            fmt.Println(j)
        }(i)
    }
    time.Sleep(3*time.Microsecond)
    return
}

運行結(jié)果:

?  test go run ./test_goroutine.go
0
1
2
3
4
5
6
7
8
9
?  test go run ./test_goroutine.go
5
4
6
?  test go run ./test_goroutine.go
?  test go run ./test_goroutine.go

結(jié)論:主程序結(jié)束時還在運行中的 goroutine 也會終止西壮。

怎樣讓主程序等待所有 goroutine 退出:

  • 使用管道 channel闷哆,適用于單個 goroutine

    func main() {
        ch := make(chan int)
        go func(c chan int){
            time.Sleep(time.Second * 3)
            fmt.Println("goroutine 即將結(jié)束冶共。")
            c <- 1
        }(ch)
    
        fmt.Println("主程序即將結(jié)束很钓。")
    
        <- ch
    
        fmt.Println("主程序退出挨队。")
    }
    

    運行結(jié)果:

    主程序即將結(jié)束狈茉。
    goroutine 即將結(jié)束。
    主程序退出恩急。
    
  • 使用 WaitGroup

    import (
        "fmt"
        "sync"
    )
    
    func main() {
        wg := sync.WaitGroup{}
    
        // wg.Add(10)
        for i := 0; i < 10; i++ {
            wg.Add(1)
            go func(j int, wg *sync.WaitGroup) {
                defer wg.Done()
                fmt.Printf("goroutine %d 即將退出杉畜。\n", j + 1)
            }(i, &wg) // 此處注意使用指針傳遞,否則 goroutine 中的 wg 為新的對象
        }
    
        fmt.Println("主程序即將退出衷恭。")
        wg.Wait()
        fmt.Println("主程序退出此叠。")
    }
    

    運行結(jié)果:

    主程序即將退出。
    goroutine 4 即將退出随珠。
    goroutine 1 即將退出灭袁。
    goroutine 2 即將退出。
    goroutine 3 即將退出窗看。
    goroutine 7 即將退出茸歧。
    goroutine 5 即將退出。
    goroutine 6 即將退出显沈。
    goroutine 9 即將退出软瞎。
    goroutine 10 即將退出。
    goroutine 8 即將退出。
    主程序退出铜涉。
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遂唧,隨后出現(xiàn)的幾起案子芙代,更是在濱河造成了極大的恐慌,老刑警劉巖盖彭,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹烹,死亡現(xiàn)場離奇詭異,居然都是意外死亡召边,警方通過查閱死者的電腦和手機铺呵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧熙,“玉大人片挂,你說我怎么就攤上這事≌甓ⅲ” “怎么了音念?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躏敢。 經(jīng)常有香客問我闷愤,道長,這世上最難降的妖魔是什么件余? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任讥脐,我火速辦了婚禮,結(jié)果婚禮上啼器,老公的妹妹穿的比我還像新娘旬渠。我一直安慰自己,他們只是感情好端壳,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布坟漱。 她就那樣靜靜地躺著,像睡著了一般更哄。 火紅的嫁衣襯著肌膚如雪芋齿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天成翩,我揣著相機與錄音觅捆,去河邊找鬼。 笑死麻敌,一個胖子當著我的面吹牛栅炒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赢赊,長吁一口氣:“原來是場噩夢啊……” “哼乙漓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起释移,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤叭披,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后玩讳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩蜘,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年熏纯,在試婚紗的時候發(fā)現(xiàn)自己被綠了同诫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡樟澜,死狀恐怖误窖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秩贰,我是刑警寧澤贩猎,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站萍膛,受9級特大地震影響吭服,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝗罗,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一艇棕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧串塑,春花似錦沼琉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傻昙,卻和暖如春闺骚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妆档。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工僻爽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贾惦。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓胸梆,卻偏偏與公主長得像敦捧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碰镜,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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