golang之sync包之WaitGroup

sync包

sync是synchronization同步这个词的缩写,所以也会叫做同步包。这里提供了基本同步的操作,比如互斥锁等等。这里除了Once和WaitGroup类型之外,大多数类型都是供低级库例程使用的。更高级别的同步最好通过channel通道和communication通信来完成。

WaitGroup

同步等待组,在类型上,它是一个结构体。一个WaitGroup的用途是等待一个goroutine的集合执行完成。主goroutine调用了Add()方法来设置要等待的goroutine的数量。然后,每个goroutine都会执行并且执行完成后调用Done()这个方法。与此同时,可以使用Wait()方法来阻塞,直到所有的goroutine都执行完成。

Add & Done & Wait

通过add设置需要同步等待的goroutine的数量,所有goroutine执行完成之后,调用Done方法来进行继续执行,其中wait用来等待goroutine的执行完毕,如果没有,则一直等待。

示例代码


package main
import(
      "fmt",
    "sync"
)

func main() {
    sayHello := func(wg *sync.WaitGroup, id int) {
        defer wg.Done()
        fmt.Printf("%v goroutine start ...\n", id)
        time.Sleep(2)
        fmt.Printf("%v goroutine exit ...\n", id)
    }

    var wg sync.WaitGroup
    const N = 5
    wg.Add(N)
    for i := 0; i < N; i++ {
        go sayHello(&wg, i)
    }

    fmt.Println("waiting for all goroutine ")
    wg.Wait()
    fmt.Println("All goroutines finished!")
}