简介

不要把增加其计数器值的操作和调用其Wait方法的代码,放在不同的 goroutine 中执行。换句话说,要杜绝对同一个WaitGroup值的两种操作的并发执行

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

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

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

也可以通过这种方式创建

wg := new(sync.WaitGroup)
  • Add 用来添加 goroutine 的个数

  • Done 执行一次数量减 1

  • 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千万次的性能

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.WaitGroupc := 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中的WaitGroup相关推荐

  1. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  2. php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步

    如何实现子goroutine与主线程的同步 第一种方式:time.sleep(),这种方式很太死板,就不演示了. 第二种方式:使用channel机制,每个goroutine传一个channel进去然后 ...

  3. golang中的sync.WaitGroup

    golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...

  4. Golang中WaitGroup、Context、goroutine定时器及超时学习笔记

    原文连接:http://targetliu.com/2017/5/2... 好久没有发过文章了 - -||,今天发一篇 golang 中 goroutine 相关的学习笔记吧,以示例为主. WaitG ...

  5. 进一步认识golang中的并发

    如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟.需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发. 并发的意 ...

  6. golang中并发sync和channel

    golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...

  7. go语言os.exit(1)_在Golang中各种永远阻塞的姿势

    在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...

  8. Golang中各种永远阻塞的方法

    在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...

  9. 记一次golang中sync.Map并发创建、读取的问题

    记一次golang中sync.Map并发创建.读取的问题  cunfate https://www.jianshu.com/p/f472e79909bc 背景: 我们有一个用go做的项目,其中用到了z ...

最新文章

  1. 查看mysql编译参数
  2. oracle自动选择索引
  3. 在Centos7 更改Docker默认镜像和容器的位置
  4. 两次秒售罄的小米10,还能火爆多久?
  5. Java实现MD5加密解密类
  6. ADSL与路由器密码大全及设置
  7. 复试c语言笔试题,考研计算机复试(C语言复试笔试题)(精华题选)
  8. XeLaTeX-中文排版解决方案
  9. 网课录屏用什么软件好?Camtasia极简操作,课程重点一目了然
  10. Xmanager4注册码
  11. 求方程ax^2+bx+c=0的根,用3个函数分别求当b^2-4ac大于0、等于0和小于0时的根,并输出结果。 从主函数输入a, b, c的值。
  12. 特征工程——用转换器抽取特征
  13. C/C++ 电脑微信dat文件解密及工具分享
  14. 银行家算法(C++实现)
  15. ggplot2简明教程
  16. ARFoundation之路-光照估计
  17. 计算机软件 csc csu,4-TS-软件设计说明模板(GJB438A).doc
  18. 西门子PLC伺服大型20轴程序modbus通讯RS232通讯MES通讯气缸
  19. 企业财务制度二--(五)损益类科目 5801 以前年度损益调整(转载)
  20. 设计原则——设计模式基础

热门文章

  1. 修改Linux root用户名 后提示network manager启动失败修复
  2. mysql备份与还原
  3. [国家集训队]最长双回文串 manacher
  4. 第三章 dubbo内核之ioc源码解析
  5. OSI七层模型与TCP/IP四层模型
  6. ubuntu 16.04 中配置Eclipse c++开发环境
  7. C/C++编程的一些技巧
  8. android位运算简单讲解
  9. JAVA学习之路 (三) 运算符
  10. webpack构建vue项目