加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

go 中的WaitGroup

发布时间:2021-05-21 05:18:07 所属栏目:大数据 来源: https://www.jb51.cc
导读:wait_group sync.WaitGroup 类型是并发安全的,也是开箱就能用的。 该类型有三个指针方法,即:Add,Done和Wait. sync.WaitGroup是一个结构体类型。其中一个代表计数的字节数组类型的字段,该 字段用4字节表示给定计数,另4字节表示等待计数。当一个sync.Wait

wait_group

sync.WaitGroup 类型是并发安全的,也是开箱就能用的。 该类型有三个指针方法,即:Add,Done和Wait.

sync.WaitGroup是一个结构体类型。其中一个代表计数的字节数组类型的字段,该 字段用4字节表示给定计数,另4字节表示等待计数。当一个sync.WaitGroup类型的变 量被声明之后,其中的这两个计数都会是0。可以通过add方法增大或减少其中给定计数, 例如:

@H_301_6@
wg.Add(3)
@H_301_6@
wg.Add(-1)

我们知道add和done方法可以变更计数器的值,但是变更之后具体有什么 作用呢?

当调用sync.WaitGroup类型值的Wait方法时,它会去检查给定计数。如果 该计数为0,那么该方法会立即返回,且不会对程序产生任何影响。但是, 如果这个计数器大于0,该方法调用所在的那个goroutine就会阻塞,同时 等待计数器会加1。直到在该值的add或done方法被调用时给定计数变回0. 该值才会去唤醒因此等待而阻塞的所有goroutine,同时清零等待计数。

现在我们有一个案例: 假设程序启用了4个goroutine,分别是g1,g2,g3,g4。其中g2,g4是由代码g1 启用的,g1启用之后并且要等待这些特殊任务的完成。

使用通道来进行阻塞

@H_301_6@
  sign := make(chan int,3)
    go func() {
        sign <- 2
        fmt.Println()
    }()
    go func() {
        sign <- )
    }()

    go func() {
        sign <- 4)
    }()

    for i := 0; i < 3; i++ {
        fmt.Println("执行",<-sign)
    }
使用通道的有过于繁重了,原则上,我们不应该把通道当做互斥锁或信号量来使用。

使用waitGroup

@H_301_6@
var wg sync.WaitGroup

    wg.Add()
    go func() {
        wg.Done()
        fmt.Println()
    }()
    go func() {
        wg.Done()
        fmt.Println()
    }()

    wg.Wait()
    fmt.Println(1 2 3 4 end")

??

参考:go并发编程实战

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读