• Go并发控制之sync.WaitGroup


        WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的。使用方法非常简单,真心佩服创造Golang的大师们!

    
    

    type WaitGroup               //相当于一个箱子,将main goroutine 保护到里面

    func (*WaitGroup) Add   //调用一次为箱子加一把锁(当然,你愿意也可以多把)

    func (*WaitGroup) Done  // 调用一次开一把锁(only one!) 

    func (*WaitGroup) Wait    //箱子的盖子,没锁了自动打开

    官网说明:一个WaitGroup锁等待一个goroutines合集结束。main goroutine里面调用Add方法设置需要等待的goroutines 数量,然后运行每一个goroutine,并且当其结束时调用Done方法。同时,main goroutine 被锁住直到所有的goroutines完成。

    使用方法(官网Example):

    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()

     

    任何放在wg.Wait() 后面的语句阻塞,直到所有的goroutine返回:

    package main
    
    import (
            "fmt"
            "net/http"
            "sync"
    )
    
    func main() {
            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)
                            fmt.Println("我先干活, 主程序等着我")
                    }(url)
            }
            // Wait for all HTTP fetches to complete.
            wg.Wait()
            fmt.Println("应该最后才出来")
    
    }
  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第4次作业
    第11组 Alpha事后诸葛亮
    第11组 Alpha冲刺(6/6)
    第11组 Alpha冲刺(5/6)
    2019 SDN上机第3次作业
    2019 SDN阅读作业
    第11组 Alpha冲刺(4/6)
    第11组 Alpha冲刺(3/6)
    模式识别和机器学习、数据挖掘的区别与联系(转发)
  • 原文地址:https://www.cnblogs.com/DillGao/p/6234461.html
Copyright © 2020-2023  润新知