聊一聊go的協程

最近在學習go語言,學習到了協程,來記錄下學習的心路歷程

先來看下例子:打印5個hello和5個world

package main

func say(s string) {
    for i := 0; i < 5; i++ {
        println(s)
    }
}

func main() {
    go say("Hello")
    go say("World")
}

go 啓動協程的方式就是使用關鍵字 go,後面一般接一個函數或者匿名函數

執行上述代碼發現什麼也沒有輸出 ,爲什麼?

因爲當使用go啓動協程之後,這2個函數就被切換到協程裏面執行了,但是這時候主線程main結束了,這2個協程還沒來得及執行就掛了!

那給主線程加個睡眠時間1s試試

func main() {
    go say("hello")
    go say("world")
    //睡眠1s
    time.Sleep(time.Second*1)
}

會發現可以打印出5個Hello 和 5個World,多次運行你會發現Hello 和 World 的順序不是固定的,這進一步說明了一個問題,那就是多個協程是同時執行的!

那在試試go 自帶一個WaitGroup

package main

import (
    "fmt"
    "sync"
)

//var 是聲明瞭一個全局變量 wg
var wg sync.WaitGroup

func say(s string){
    for i:=0;i<5;i++{
        fmt.Println(s)
    }
    //wg.Done 相當於 wg.Add(-1) 意思就是我這個協程執行完了
    wg.Done()
}


func main() {
    //聲明有兩個協程需要處理
    wg.Add(2)

    go say("hello")
    go say("world")

    //wg.Wait() 就是告訴主線程要等一下,等他們2個都執行完再退出
    wg.Wait()
}

執行結果是想實現的效果!

謝謝,all!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章