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结构体的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

相关文章

  • Golang 端口复用测试的实现

    Golang 端口复用测试的实现

    这篇文章主要介绍了Golang 端口复用测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • go build 通过文件名后缀实现不同平台的条件编译操作

    go build 通过文件名后缀实现不同平台的条件编译操作

    这篇文章主要介绍了go build 通过文件名后缀实现不同平台的条件编译操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang实践笔录之读取yaml配置文件

    Golang实践笔录之读取yaml配置文件

    YAML是YAML Ain't a Markup Language的缩写,YAML不是一种标记语言,相比JSON格式的方便,这篇文章主要给大家介绍了关于Golang实践笔录之读取yaml配置文件的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • golang 各种排序大比拼实例

    golang 各种排序大比拼实例

    这篇文章主要介绍了golang 各种排序大比拼实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go modules replace解决Go依赖引用问题

    Go modules replace解决Go依赖引用问题

    这篇文章主要为大家介绍了Go modules replace解决Go依赖引用问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang 分割字符串的实现示例

    Golang 分割字符串的实现示例

    本文主要介绍了Golang 分割字符串的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang利用不到20行代码实现路由调度详解

    golang利用不到20行代码实现路由调度详解

    这篇文章主要给大家介绍了关于golang利用不到20行代码实现路由调度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Go Resiliency库中timeout实现原理及源码解析

    Go Resiliency库中timeout实现原理及源码解析

    Go-Resiliency库中的timeout是一种基于协程的超时机制,通过创建协程来执行任务并设置超时时间,若任务执行时间超时则中止协程并返回错误,需要详细了解可以参考下文
    2023-05-05
  • Go Excelize API源码解读GetSheetViewOptions与SetPageLayout

    Go Excelize API源码解读GetSheetViewOptions与SetPageLayo

    这篇文章主要为大家介绍了Go Excelize API源码解读GetSheetViewOptions与SetPageLayout方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go指针的具体使用

    Go指针的具体使用

    本文主要介绍了Go指针的具体使用,包括使用指针、空指针、指针数组、指向指针的指针等,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论