最近在學習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!