golang 同步等待全部協程執行完畢sync WaitGroup

golang的sync的包有一個功能WaitGroupgolang

 

做用異步

阻塞主線程的執行,直到全部的goroutine執行完成,說白了就是必須同步等待全部異步操做完成!!!spa

 

三個方法線程

Add:添加或者減小等待goroutine的數量blog

Done:至關於Add(-1)同步

Wait:執行阻塞,直到全部的WaitGroup數量變成0it

 

example:class

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i = i + 1 {
		wg.Add(1)
		go func(n int) {
			// defer wg.Done()
			defer wg.Add(-1)
			EchoNumber(n)
		}(i)
	}

	wg.Wait()
}

func EchoNumber(i int) {
	time.Sleep(3e9)
	fmt.Println(i)
}

  程序很簡單,只是將每次循環的數量過3秒鐘輸出。那麼,這個程序若是不用WaitGroup,那麼將看不見輸出結果。由於goroutine還沒執行完,主線程已經執行完畢。註釋的defer wg.Done()和defer wg.Add(-1)做用同樣。import

這個很好,原來執行腳本,都是使用time.Sleep,用一個估計的時間等到子線程執行完。WaitGroup很好。雖然chanel也能實現,可是以爲若是涉及不到子線程與主線程數據同步,這個感受不錯。循環

相關文章
相關標籤/搜索