golang之sync包之WaitGroup

追梦人在路上不断追寻 · · 662 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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!")
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:追梦人在路上不断追寻

查看原文:golang之sync包之WaitGroup

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

662 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传