WaitGroup是Go语言中的一个同步原语,用于等待一组goroutine的完成。
下面是一个简单的应用实例,演示了如何使用WaitGroup等待一组goroutine的完成:
package main
import (
"fmt"
"sync"
"time"
)
// 模拟耗时操作,每个goroutine等待一秒钟
func doSomething(i int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Goroutine %d start\n", i)
time.Sleep(time.Second)
fmt.Printf("Goroutine %d done\n", i)
}
func main() {
var wg sync.WaitGroup
// 启动5个goroutine
for i := 0; i < 5; i++ {
wg.Add(1)
go doSomething(i, &wg)
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All goroutines done")
}
在上面的例子中,我们定义了一个doSomething函数来模拟耗时的操作。在main函数中,我们创建了一个WaitGroup,并在启动每个goroutine之前调用Add方法来增加计数器。
然后,每个goroutine执行doSomething函数,并在完成后调用Done方法来递减计数器。
最后,我们调用Wait方法来等待所有goroutine完成。一旦计数器归零,Wait方法将返回,程序继续执行。
运行上面的代码,你将看到类似以下的输出:
Goroutine 0 start
Goroutine 1 start
Goroutine 2 start
Goroutine 3 start
Goroutine 4 start
Goroutine 0 done
Goroutine 2 done
Goroutine 3 done
Goroutine 4 done
Goroutine 1 done
All goroutines done
从输出中可以看出,所有的goroutine都已经完成,并且在最后打印了"All goroutines done"。
通过使用WaitGroup,我们可以方便地等待一组goroutine的完成,从而控制程序的执行顺序和并发度。这在并发编程中是非常常见和实用的技术。