Go主协程如何等其余协程完再操作?
Go语言中,主协程(主goroutine)可以通过sync.WaitGroup
来等待其他的goroutine完成。sync.WaitGroup
是一个等待组,提供了等待一组goroutine完成的能力。
在启动一个新的goroutine时,可以调用WaitGroup.Add(1)
来增加等待的goroutine数量。在goroutine完成时,可以调用WaitGroup.Done()
来减少等待的goroutine数量。在主goroutine中,可以调用WaitGroup.Wait()
来阻塞,直到所有的goroutine都调用了Done()
,Wait()
函数才会返回,然后主goroutine可以继续执行。
以下是一个使用sync.WaitGroup
的例子:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
time.Sleep(time.Second * time.Duration(i))
fmt.Printf("Goroutine %d finished\n", i)
}(i)
}
fmt.Println("Waiting for all goroutines to finish")
wg.Wait()
fmt.Println("All goroutines finished")
}
在这个例子中,我们启动了5个goroutine,并且每个goroutine在启动时都调用wg.Add(1)
来增加等待的数量。每个goroutine在完成时都调用defer wg.Done()
来减少等待的数量。在主goroutine中,我们调用wg.Wait()
来等待所有的goroutine完成。