在Golang中,我們可以使用sync
包中的WaitGroup
來實現(xiàn)并發(fā)控制。WaitGroup
用于等待一組goroutine完成執(zhí)行。
下面是一個使用WaitGroup
來完成任務(wù)的示例:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 設(shè)置要執(zhí)行的任務(wù)數(shù)量
taskCount := 5
wg.Add(taskCount)
for i := 1; i <= taskCount; i++ {
go performTask(i, &wg)
}
// 等待所有任務(wù)完成
wg.Wait()
fmt.Println("所有任務(wù)已完成")
}
func performTask(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("開始執(zhí)行任務(wù) %d\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("任務(wù) %d 完成\n", id)
}
在上面的示例中,我們首先創(chuàng)建了一個WaitGroup
實例wg
,然后設(shè)置要執(zhí)行的任務(wù)數(shù)量為5,通過調(diào)用wg.Add(taskCount)
方法來增加等待的goroutine數(shù)量。
接下來,我們使用一個循環(huán)來創(chuàng)建5個goroutine,并將每個goroutine的任務(wù)ID和WaitGroup
實例的指針傳遞給performTask
函數(shù)。
在performTask
函數(shù)中,我們使用defer
關(guān)鍵字來確保在函數(shù)執(zhí)行完成后調(diào)用wg.Done()
方法,表示任務(wù)已完成。
在每個goroutine中,我們首先打印出任務(wù)開始執(zhí)行的信息,然后通過time.Sleep
函數(shù)模擬任務(wù)執(zhí)行的時間。最后,我們打印出任務(wù)完成的信息。
最后,我們調(diào)用wg.Wait()
方法來等待所有的goroutine完成任務(wù)。一旦所有的goroutine都調(diào)用了wg.Done()
方法,Wait
方法就會返回,程序繼續(xù)執(zhí)行后面的代碼。
運行上面的代碼,你會看到類似下面的輸出:
開始執(zhí)行任務(wù) 1
開始執(zhí)行任務(wù) 2
開始執(zhí)行任務(wù) 3
開始執(zhí)行任務(wù) 4
開始執(zhí)行任務(wù) 5
任務(wù) 3 完成
任務(wù) 1 完成
任務(wù) 4 完成
任務(wù) 5 完成
任務(wù) 2 完成
所有任務(wù)已完成
從輸出可以看出,5個任務(wù)是并發(fā)執(zhí)行的,但是最后的輸出表明所有的任務(wù)都已完成。
使用WaitGroup
來完成任務(wù)的并發(fā)控制,它可以確保在所有的goroutine執(zhí)行完成之前,主goroutine會一直等待。這在需要等待一組goroutine完成執(zhí)行后再進(jìn)行后續(xù)操作的場景中非常有用。