首页 > 其他分享 >golang 的 sync.WaitGroup

golang 的 sync.WaitGroup

时间:2023-06-22 19:38:10浏览次数:50  
标签:wg WaitGroup sync golang Add Done func Wait

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

参考:

http://www.liguosong.com/2014/05/06/golang-sync-waitgroup/

标签:wg,WaitGroup,sync,golang,Add,Done,func,Wait
From: https://blog.51cto.com/u_15588078/6535311

相关文章

  • Golang 做的几个跟性能有关的工具
    1、Vegetahttps://github.com/tsenart/vegetaVegeta是一个万能的HTTP负载测试工具,提供命令行工具和一个开发包。使用方法:$vegetaattack-hUsageofattack:-duration=10s:Durationofthetest-header=:Targetsrequestheader-ordering="random":Attackorderi......
  • win下 golang 跨平台编译
    本篇文章是win下的跨平台编译。安装GCC编译器(MinGW)我们需要GCC编译环境,这里我选择的是:MinGW。mac下安装了Xcode自动就带了GCC,win下没有,所以我们用MinGW这个最小化安装的GCC。MinGW官网提供了一种自动在线下载安装的gui小程序,http://sourceforge.net/projects/mingw/files/Install......
  • Golang 中文转拼音
    翻遍整个GitHub,Golang中文转拼音类库,怎么就这么难找呢?于是我造了一个轮子:中文转拼音类库.目前来说应该是最好用的了.GitHub传送门:https://github.com/Lofanmi/pinyin-golang如果说基于汉字拼音字典,逐个汉字替换,也是可以转换的,但是碰到多音字就很麻烦了.而......
  • 关于使用rsync命令小技巧-交互式输入密码后-再置于后台运行的方法
    在linux系统中,rsync命令常用于在两台linux主机之间同步数据rsync关于认证可以同ssh的用户密码认证一样,我们执行rsync命令后,会要求输入认证的密码,但很多时候数据特别大时,我们是希望执行过程放在后台运行笔者尝试,在执行rsync命令,如 rsync-az/aa/bb/cc/--exclude"dir01/"--ex......
  • Golang如何优雅地关闭 channel
    Golang如何优雅地关闭channel萧瑟 golang面试经典讲解 2023-05-3121:00 发表于上海一、介绍想必听说过go的,应该都知道go的最大的特性goroutine并发编程,而说到并发编程,使用channel进行数据传输是go中的必修课。go的并发哲学:不要通过共享内存来通信,而要通过通......
  • golang的位运算
    二进制字节位的几个操作例子:0110&1011=0010//与AND都为10110|1011=1111//或OR至少一个为10110^1011=1101//异或XOR只能一个为10110&^1011=0100//位清除ANDNOT清除标志位,不都为1a&^b的意思就是清零a中,ab都为1......
  • Golang 图片上绘制文字
    之前介绍过使用FreeType-go来绘制字现在相关的包被做了整合,主要是整合到了github.com/golang/freetype和golang.org/x/image/font这里了,所以就有了这篇博客。 例子代码在:https://github.com/golang/freetype/blob/master/example/freetype/main.go packagemainimport(......
  • Synchronized锁的膨胀升级-无锁及偏向锁
    转载:https://www.bilibili.com/video/BV1gP4y137pQ/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598https://www.bilibili.com/video/BV1yi4y1C7XY/?spm_id_from=trigger_reload&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
    java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?答案2023-06-21:java的:这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,synch......
  • java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
    java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?答案2023-06-21:java的:这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,s......