go waitgroup 用法详解-ag捕鱼王app官网

go waitgroup 用法详解

作者:迹忆客 最近更新:2023/01/08 浏览次数:

在下一篇我们来介绍go 工作池。 要了解工作池,我们首先需要了解 waitgroup,因为它将在工作池的实现中使用。

waitgroup 用于等待一组 goroutine 完成执行。 控制被阻塞,直到所有 goroutines 执行完毕。 假设我们有 3 个并发的从主 goroutine 衍生的 goroutine。 主 goroutines 需要等待其他 3 个 goroutines 完成才能终止。 这可以使用 waitgroup 来完成。

下面我们通过一个示例来看一下waitgroup的用法

package main
import (  
    "fmt"
    "sync"
    "time"
)
func process(i int, wg *sync.waitgroup) {  
    fmt.println("started goroutine ", i)
    time.sleep(2 * time.second)
    fmt.printf("goroutine %d ended\n", i)
    wg.done()
}
func main() {  
    no := 3
    var wg sync.waitgroup
    for i := 0; i < no; i   {
        wg.add(1)
        go process(i, &wg)
    }
    wg.wait()
    fmt.println("所有 routines 完成了执行!")
}

waitgroup 是一个结构体类型,我们创建了一个 waitgroup 类型的零值变量。 waitgroup 的工作方式是使用计数器。 当我们在 waitgroup 上调用 add() 并向它传递一个 int 时,waitgroup 的计数器会根据传递给 add 的值递增。 递减计数器的方法是在 waitgroup 上调用 done() 方法。 wait() 方法会阻塞调用它的 goroutine,直到计数器变为零。

在上面的程序中,我们在迭代 3 次的 for 循环中调用 wg.add(1)。所以计数器现在变成了 3。 for 循环还产生了 3 个 process goroutines。然后调用 wg.wait() 使主 goroutine 等待直到计数器变为零。 计数器通过在process 协程中调用 wg.done 递减。 一旦所有 3 个生成的 goroutine 执行完毕,即 wg.done() 被调用 3 次,计数器将变为 0,主 goroutine 将被解锁。

传递 wg 的指针很重要。如果没有传递指针,那么每个 goroutine 都会有自己的 waitgroup 副本,并且当它们完成执行时不会通知主协程(main)

上面程序执行结果如下

go wait group

每个人的输出可能都不同,因为 goroutines 的执行顺序可能会有所不同:)。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

c# 中的 goto 语句

发布时间:2024/02/02 浏览次数:184 分类:编程语言

本教程演示了如何在 c# 中使用 goto 以及何时使用它会有所帮助本教程将演示如何在 c# 中使用 goto 语法,并提供一些代码中的实际使用示例。

发布时间:2023/12/20 浏览次数:197 分类:python

本文为你提供了 python 中是否存在 goto 语句的答案。本文为你提供了 python 中是否存在 goto 语句的答案。基本上,python 不支持 goto 语句。

java goto

发布时间:2023/08/07 浏览次数:83 分类:java

与其他编程语言不同,java 没有 goto。 相反,java 包含关键字 label。关键字 label 的作用是改变程序的流程,根据指定的条件跳转到程序的另一段。

发布时间:2023/05/30 浏览次数:293 分类:python

当我们在 numpy 中传递一维数组而不是二维数组时,会发生错误 valueerror: expected 2d array, got 1d array instead 。如您所知,每种编程语言都会遇到很多错误,有些是在运行时,有些是在编译时。 pyth

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图