golang--sync.WaitGroup使用示例

getong · · 3987 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。使用channel的案例可以参考我的博客:golang--使用channel来同步goroutine,这里要涉及的是锁机制,更具体的是sync.WaitGroup,一种较为简单的同步方法集。

sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。

要注意的有一点。sync文档已经说明了的,The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished.也就是说,在运行main函数的goroutine里运行Add()函数,在其他的goroutine里面运行Done()函数。这个我是踩过雷了的。

最简单的案例就是sync文档里面的example,这里简单写了一个例子。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
    }

    for i := 0; i < 100; i++ {
        go wg.Done()
    }
    fmt.Println("exit")
    wg.Wait()
}

func add(wg sync.WaitGroup) {
    wg.Add(1)
}


func done(wg sync.WaitGroup) {
    wg.Done()
}

在自己的电脑使用godoc搭载的sync文档中,有一个bug,注明添加该包的方法是import "pkg/sync"。一般程序都是import "sync"。我自己测试了一下,import "sync"才是正确的,import "pkg/sync"编译都通不过各位也可以测试一下。在golang.org已经改正过来了。

转贴请注明来自:格通


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

本文来自:博客园

感谢作者:getong

查看原文:golang--sync.WaitGroup使用示例

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

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