在Go語言中,WaitGroup是一個用于等待一組goroutine完成執行的工具。它可以用來協調多個并發任務的執行和等待,確保所有任務完成后再繼續執行主線程。
下面是一個使用WaitGroup的簡單示例:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers done")
}
在這個例子中,我們定義了一個worker
函數,它接受一個id和一個WaitGroup
參數。在函數開始時,它調用wg.Done()
來通知WaitGroup
任務完成。在主函數中,我們循環創建5個worker goroutine,并且在每個goroutine啟動之前調用wg.Add(1)
來增加WaitGroup的計數。最后,我們調用wg.Wait()
來等待所有goroutine完成執行。
輸出結果可能是這樣的:
Worker 1 starting
Worker 5 starting
Worker 2 starting
Worker 3 starting
Worker 4 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 3 done
Worker 5 done
All workers done
需要注意的是,WaitGroup的計數不能為負數,因此在調用wg.Done()
之前,我們必須確保每個goroutine都調用了wg.Add(1)
。
WaitGroup還有一個常用的方法wg.Add(delta int)
,可以一次性增加或減少計數器的值。這在任務分發與負載均衡中也很有用。
例如,如果你有一個任務列表,想要將任務分配給一組goroutine進行并發處理,你可以使用WaitGroup來等待所有任務完成。在分配任務時,可以使用wg.Add(len(tasks))
來一次性增加WaitGroup的計數器,然后每個goroutine完成任務時調用wg.Done()
來減少計數器。
總結來說,Go語言的WaitGroup是一個非常有用的工具,可以幫助我們協調多個并發任務的執行和等待。通過合理地使用WaitGroup,我們可以實現任務分發和負載均衡,以提高并發程序的性能和效率。