golang 同步等待所有協程執行完畢sync WaitGroup


golang的sync的包有一個功能WaitGroup

 

作用

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

 

三個方法

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

Done:相當於Add(-1)

Wait:執行阻塞,直到所有的WaitGroup數量變成0

 

example:

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)作用一樣。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM