经常看到有人会问如何等待主协程中创建的协程执行完毕之后再结束主协程,例如如下代码:

package main
import ("fmt"
)
func main() {go func() {fmt.Println("Goroutine 1")}()go func() {fmt.Println("Goroutine 2")}()
}

执行以上代码很可能看不到输出,因为有可能这两个协程还没得到执行主协程已经结束了,而主协程结束时会结束所有其他协程。解决办法是可以在main函数结尾加上等待:

package main
import ("fmt""time"
)
func main() {go func() {fmt.Println("Goroutine 1")}()go func() {fmt.Println("Goroutine 2")}()time.Sleep(time.Second * 1) // 睡眠1秒,等待上面两个协程结束
}

这并不是完美的解决方法,如果这两个协程中包含复杂的操作,可能很耗时间,就无法确定需要睡眠多久,当然可以用管道实现同步:

package main
import ("fmt"
)
func main() {ch := make(chan struct{})count := 2 // count 表示活动的协程个数go func() {fmt.Println("Goroutine 1")ch <- struct{}{} // 协程结束,发出信号}()go func() {fmt.Println("Goroutine 2")ch <- struct{}{} // 协程结束,发出信号}()for range ch {// 每次从ch中接收数据,表明一个活动的协程结束count--// 当所有活动的协程都结束时,关闭管道if count == 0 {close(ch)}}
}

上面的解决方案是比较完美的方案,但是Go提供了更简单的方法——使用sync.WaitGroup。WaitGroup顾名思义,就是用来等待一组操作完成的。WaitGroup内部实现了一个计数器,用来记录未完成的操作个数,它提供了三个方法,Add()用来添加计数。Done()用来在操作结束时调用,使计数减一。Wait()用来等待所有的操作结束,即计数变为0,该函数会在计数不为0时等待,在计数为0时立即返回。

package main
import ("fmt""sync"
)
func main() {var wg sync.WaitGroupwg.Add(2) // 因为有两个动作,所以增加2个计数go func() {fmt.Println("Goroutine 1")wg.Done() // 操作完成,减少一个计数}()go func() {fmt.Println("Goroutine 2")wg.Done() // 操作完成,减少一个计数}()wg.Wait() // 等待,直到计数为0
}

可见用sync.WaitGroup是最简单的方式。

go WaitGroup 简单示例相关推荐

  1. python文本处理实例_Python 文件处理的简单示例

    这篇文章主要为大家详细介绍了Python 文件处理的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 相关的AP ...

  2. python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例

    这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...

  3. python简单单元测试示范卷_Python 单元测试的简单示例

    这篇文章主要为大家详细介绍了Python 单元测试的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 以前我是不 ...

  4. python二分法求解_Python使用二分法求平方根的简单示例

    这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...

  5. Unity 简单示例代码和向导/Unity Aplication Block

    Unity 简单示例代码和向导 关于Unity 的说明和下载地址,请访问[微软控制反转和依赖注入容器Unity 1.0发布] http://forum.entlib.com/Default.aspx? ...

  6. php定时刷新token,PHP 定时任务获取微信access_token的简单示例

    搜索热词 感兴趣PHP 定时任务获取微信access_token的简单示例的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧. 最近开发微信公众平台,公众号调用各接口时都需使用access_ ...

  7. python 搭建的http 动态服务器_Python 创建HTTP服务器的简单示例

    这篇文章主要为大家详细介绍了Python 创建HTTP服务器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  8. python简单装饰器_python装饰器的简单示例

    这篇文章主要为大家详细介绍了python装饰器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 装饰器的语法以 ...

  9. javascript worker 多线程 简单示例

    javascript worker 多线程 简单示例 项目结构 主线程 index.html <!DOCTYPE html> <html lang="en"> ...

最新文章

  1. 从前端框架到前端架构参考资料
  2. Visual Studio 2010中添加App_Code文件夹注意事项
  3. 主流浏览器和内核及Web标准
  4. 安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
  5. java多线程【线程常用方法】
  6. python图片压缩算法_Optipng,jpegoptim应用,用python实现图片压缩,让你的网站变得更快...
  7. 软件基本功:数组赋值,一定要对齐
  8. Python开发Http代理服务器 - socketref,再见!高德 - C++博客
  9. Microsoft Office/visio/Project 2013 with SP1 简体中文零售版
  10. 第3章 数据库操作SQL语言---数据库原理及应用
  11. Echarts使用教程
  12. Java实现简单的银行管理系统(最基本的功能/易上手)
  13. Ubuntu安装翻译软件(goldendcit)
  14. 2.shel脚本l知识点学习一
  15. 数据挖掘项目之Airbnb 新用户的民宿预定结果预测
  16. mac c语言 新手,第1次买Mac必看,新手买Mac全攻略!
  17. 艾伦图灵_艾伦唤醒控制
  18. CAS算法与ABA问题
  19. 深聊性能测试,从入门到放弃之: Windows系统性能监控(三)任务管理器介绍及使用。
  20. 从零开始Tableau | 11.表计算-计算依据

热门文章

  1. frame页面地址转向跨域解决方法
  2. 2020CCPC(威海) - Clock Master(数论+分组背包)
  3. CodeForces - 1354D Multiset(线段树/二分)
  4. CodeForces - 1295D Same GCDs(欧拉函数)
  5. CodeForces - 622C Not Equal on a Segment(思维+水题)
  6. winform关闭当前form_C#中WinForm程序退出方法技巧总结
  7. 安卓入门系列-03安卓的开发方式(逻辑与视图分离)
  8. gbd 分析core文件_Go 性能分析工具 pprof 入门
  9. 浅谈文本的相似度问题
  10. POJ1330(最近公共祖先)