Go语言同步等待组sync.WaitGroup结构体对象方法详解

 更新时间:2022年08月26日 11:46:48   作者:陈博士  
这篇文章主要为大家介绍了Go语言同步等待组sync.WaitGroup结构体对象方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

sync.WaitGroup结构体对象

在Go语言中,sync.WaitGroup结构体对象用于等待一组线程的结束;WaitGroup是go并发中最常用的工具,我们可以通过WaitGroup来表达这一组协程的任务是否完成,以决定是否继续往下走,或者取任务结果;

WaitGroup的结构体

结构如下所示:

type WaitGroup struct { 
    noCopy noCopy 
    state1 [3]uint32 
}

在sync.WaitGroup结构体对象中有三个方法,Add()、Done()、Wait()

Add()方法

主要为WaitGroup的等待数+1或者+n;

Add()方法的定义如下:

func(*WaitGroup) Add()
  • Add()方法内部计数器加上delta,delta可以是负数;
  • 如果内部计数器变为0,则Wait()方法会将处于阻塞等待的所有goroutine释放;
  • 如果计数器小于0,则调用panic()函数;
  • Add()方法加上正数的调用应在Wait()方法之前,否则Wait()方法可能只会等待很少的goroutine;
  • Add()方法在创建新的goroutine或者其它等待的事件之前调用;

Done()方法

Done函数调用的也是Add函数,主要用于-1操作;

Done()方法的定义如下:

func(wg *WaitGroup) Done()
  • Done()方法会减少WaitGroup计数器的值,一般在goroutine的最后执行;

Wait()方法

阻塞当前协程,直到等待数归为0才继续向下执行;

Wait()方法的定义如下:

func (wg *WaitGroup) Wait()

Wait()方法会阻塞,知道WaitGroup计数器减为0.

Add()、Done()、Wait()三者对比

  • 在三个方法中,使用Add()方法添加计数,使用Done()方法减掉一个计数,如果计数不为0,则会阻塞Wait()方法的运行;
  • 一个goroutine调用Add()方法来设定等待的goroutine的数量;
  • 每个被等待的goroutine在结束时调用Done()方法;
  • 在主goroutine里可以调用Wait()方法阻塞至所有goroutine结束;

sync.WaitGroup使用示例

使用sync.WaitGroup等待goroutine结束的示例如下图所示:

以上就是Go语言同步等待组sync.WaitGroup结构体对象方法详解的详细内容,更多关于Go sync.WaitGroup结构体的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

相关文章

  • 详解Go操作supervisor xml rpc接口及注意事项

    详解Go操作supervisor xml rpc接口及注意事项

    这篇文章主要介绍了Go操作supervisor xml rpc接口及注意事项,管理web,在配置文件中配置相关信息,通过go-supervisor的处理库进行操作,需要的朋友可以参考下
    2021-09-09
  • GoLang string与strings.Builder使用对比详解

    GoLang string与strings.Builder使用对比详解

    这篇文章主要介绍了GoLang string与strings.Builder使用对比,Builder 用于使用 Write 方法有效地构建字符串。它最大限度地减少了内存复制。零值可以使用了。不要复制非零生成器
    2023-03-03
  • Golang中for循环的用法示例详解

    Golang中for循环的用法示例详解

    for循环就是让一段代码循环的执行,接下来通过本文给大家讲解Golang中for循环的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 基于Golang编写贪吃蛇游戏

    基于Golang编写贪吃蛇游戏

    这篇文章主要为大家学习介绍了Golang如何基于终端库termbox-go做个功能较简单的贪吃蛇游戏,文中的示例代码讲解详细,具有一定的学习价值
    2023-07-07
  • 一文带你搞懂golang中内存分配逃逸分析

    一文带你搞懂golang中内存分配逃逸分析

    这篇文章主要带大家一起学习一下golang中内存分配逃逸分析,文中的示例代码讲解详细,对我们深入了解golang有一定的帮助,感兴趣的小伙伴可以了解下
    2023-08-08
  • golang实现的文件上传下载小工具

    golang实现的文件上传下载小工具

    这篇文章主要介绍了golang实现的文件上传下载小工具,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Beego中ORM操作各类数据库连接方式详细示例

    Beego中ORM操作各类数据库连接方式详细示例

    这篇文章主要为大家介绍了Beego中ORM操作各类数据库连接方式详细示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang的匿名函数和普通函数的区别解析

    golang的匿名函数和普通函数的区别解析

    匿名函数是不具名的函数,可以在不定义函数名的情况下直接使用,通常用于函数内部的局部作用域中,这篇文章主要介绍了golang的匿名函数和普通函数的区别,需要的朋友可以参考下
    2023-03-03
  • go语言go func(){select{}}()的用法

    go语言go func(){select{}}()的用法

    本文主要介绍了go语言go func(){select{}}()的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • Go实现简单的数据库表转结构体详解

    Go实现简单的数据库表转结构体详解

    这篇文章主要为大家介绍了Go实现简单的数据库表转结构体详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论