专栏首页Golang语言社区Golang中的sync.WaitGroup用法实例

Golang中的sync.WaitGroup用法实例

WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。

官方对它的说明如下:

A WaitGroup waits for a collection of goroutines to finish. 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. At the same time, Wait can be used to block until all goroutines have finished.

sync.WaitGroup只有3个方法,Add(),Done(),Wait()。

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

例子代码如下:

同时开三个协程去请求网页, 等三个请求都完成后才继续 Wait 之后的工作。

var wg sync.WaitGroup 
var urls = []string{ 
 "http://www.golang.org/", 
 "http://www.google.com/", 
 "http://www.somestupidname.com/", 
} 
for _, url := range urls { 
 // Increment the WaitGroup counter. 
 wg.Add(1) 
 // Launch a goroutine to fetch the URL. 
 go func(url string) { 
 // Decrement the counter when the goroutine completes. 
 defer wg.Done() 
 // Fetch the URL. 
 http.Get(url) 
 }(url) 
} 
// Wait for all HTTP fetches to complete. 
wg.Wait()

或者下面的测试代码

用于测试 给chan发送 1千万次,并接受1千万次的性能。

package main
import ( 
 "fmt" 
 "sync" 
 "time" 
)
const ( 
 num = 10000000 
)
func main() { 
 TestFunc("testchan", TestChan) 
}
func TestFunc(name string, f func()) { 
 st := time.Now().UnixNano() 
 f() 
 fmt.Printf("task %s cost %d \r\n", name, (time.Now().UnixNano()-st)/int64(time.Millisecond)) 
}
func TestChan() { 
 var wg sync.WaitGroup 
 c := make(chan string) 
 wg.Add(1)
 go func() { 
 for _ = range c { 
 } 
 wg.Done() 
 }()
 for i := 0; i < num; i++ { 
 c <- "123" 
 }
 close(c) 
 wg.Wait()
}

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Golang中的sync.WaitGroup用法实例

    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A...

    李海彬
  • 阅读源代码的姿势:以 go-restful 为例

    一般初学者确定一个方向,比如web 后端、前端等,会选择一门编程语言深入下去,比如后端java、python、go等。通过项目不断练习编程语言和编程思维,知道如...

    李海彬
  • golang取两个数字之间的随机数

    package main import ( "crypto/rand" "math/big" "fmt" ) fun...

    李海彬
  • Golang中的sync.WaitGroup用法实例

    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A...

    李海彬
  • nginx 请求开始时间

    用户反馈广告主平台上传视频满,在本地尝试重现,发现上传一个30M左右的视频大概花40s左右,多个视频上传还是串行,目前前端已经优化为了并行上传,但一个视频花费4...

    千往
  • Android AppBar

    AppBar官方文档摘记 2016-6-12 本文摘自Android官方文档,为方便自己及其他开发者朋友阅读。 章节目录为“Develop > Trainin...

    用户1172465
  • Druid 在有赞的实践

    Druid 是 MetaMarket 公司研发,专为海量数据集上的做高性能 OLAP (OnLine Analysis Processing)而设计的数据存储和...

    Fayson
  • 快速学习Oracle-分组统计

    范例:查询出部门人数大于 5 人的部门 分析:需要给 count(ename)加条件,此时在本查询中不能使用 where,可以使用 HAVING

    cwl_java
  • 炫彩文字特效页面源码

    雨尘
  • 「网站优化」网站优化宝典-网站优化建议

    自己在哪里,要去哪里,不假思索的点击链接,找到自己想要的信息;实现这个目标,需要良好的导航系统,适时出现的内部链接,准确的锚文字。

    大脸猫

扫码关注云+社区

领取腾讯云代金券