• Golang并发-Go优雅的退出程序(同步等待组 sync.WaitGroup)


    Golang并发:并发协程的优雅退出

    同步等待组 sync.WaitGroup

    Go语言中除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务。

    sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。

    在实际使用Go协程实现并行应用时,可能会遇到这样场景:需要阻塞部分代码执行,直到其他协程成功执行之后才继续执行。

    同步等待组(WaitGroups)就是要解决这类问题,阻塞应用直到同步等待组中的所有协程都成功执行。

    等待组内部拥有一个计数器,计数器的值可以通过方法调用实现计数器的增加和减少。当我们添加了 N 个并发任务进行工作时,就将等待组的计数器值增加 N。每个任务完成时,这个值减 1。同时,在另外一个 goroutine 中等待这个等待组的计数器值为 0 时,表示所有任务已经完成。

    首先调用同步等待组的Add(1)方法,设置需要等待协程数量, 然后再协程内部调用Done() 方法表明协程执行结束。

    注意,需要确保再执行协程之前调用Add(1)方法。

    WaitGroup 有三个方法,其中 Done() 调用了 Add(-1)。标准用法:
    (1)启动 Go 程时调用 Add();
    (2)在 Go 程结束时调用 Done();
    (3)最后调用 Wait()。

    WaitGroup 对外提供了3个接口:
    在这里插入图片描述

    示例

    同时开三个协程去请求网页, 等三个请求都完成后才继续 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()
    

    sync.WaitGroup 实现原理

    sync.WaitGroup 实现原理
    参考URL: https://www.jianshu.com/p/6cedae8c18a0
    Golang package sync 剖析(二): sync.WaitGroup
    链接:https://segmentfault.com/a/1190000021653777

    参考

    Golang并发:并发协程的优雅退出
    参考URL: https://www.jianshu.com/p/79d27f200bcf
    Go 协程的开启和退出
    https://studygolang.com/articles/28457?fr=sidebar
    Go语言等待组(sync.WaitGroup)
    参考URL: http://c.biancheng.net/view/108.html

  • 相关阅读:
    高效Go编程: encoding/csv标准库深度解析
    Map+函数式接口如何“更完美”的解决 if-else的问题
    python之时间、时间戳、时间加减
    [软件] phantomjs屏幕截图
    2.1_3进程控制
    zabbix中文乱码解决方法
    2022杭电多校7(总结+补题)
    新入手的Mac需要做的事
    Unity3D 连接 SQLite 作为数据库基础功能【详细图文教程】
    待看12313132
  • 原文地址:https://blog.csdn.net/inthat/article/details/107000010