我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go中的WaitGroup怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go中的WaitGroup怎么使用

今天小编给大家分享一下Go中的WaitGroup怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

正常情况下,新激活的goroutine(协程)的结束过程是不可控制的,唯一可以保证终止goroutine(协程)的行为是main goroutine(协程)的终止。也就是说,我们并不知道哪个goroutine(协程)什么时候结束。

但很多情况下,我们正需要知道goroutine(协程)是否完成。这需要借助sync包的WaitGroup来实现。

WatiGroup是sync包中的一个struct类型,用来收集需要等待执行完成的goroutine(协程)。下面是它的定义:

type WaitGroup struct {        // Has unexported fields.}    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.    A WaitGroup must not be copied after first use.func (wg *WaitGroup) Add(delta int)func (wg *WaitGroup) Done()func (wg *WaitGroup) Wait()

它有3个方法:

  • Add():每次激活想要被等待完成的goroutine(协程)之前,先调用Add(),用来设置或添加要等待完成的goroutine(协程)数量

    • 例如Add(2)或者两次调用Add(1)都会设置等待计数器的值为2,表示要等待2个goroutine(协程)完成

  • Done():每次需要等待的goroutine(协程)在真正完成之前,应该调用该方法来人为表示goroutine(协程)完成了,该方法会对等待计数器减1

  • Wait():在等待计数器减为0之前,Wait()会一直阻塞当前的goroutine(协程)

也就是说,Add()用来增加要等待的goroutine(协程)的数量,Done()用来表示goroutine(协程)已经完成了,减少一次计数器,Wait()用来等待所有需要等待的goroutine(协程)完成。

下面是一个示例,通过示例很容易理解。

package mainimport (      "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("All go routines finished executing")}

上面激活了3个goroutine,每次激活goroutine之前,都先调用Add()方法增加一个需要等待的goroutine计数。每个goroutine都运行process()函数,这个函数在执行完成时需要调用Done()方法来表示goroutine的结束。激活3个goroutine后,main goroutine会执行到Wait(),由于每个激活的goroutine运行的process()都需要睡眠2秒,所以main goroutine在Wait()这里会阻塞一段时间(大约2秒),当所有goroutine都完成后,等待计数器减为0,Wait()将不再阻塞,于是main goroutine得以执行后面的Println()。

还有一点需要特别注意的是process()中使用指针类型的*sync.WaitGroup作为参数,这里不能使用值类型的sync.WaitGroup作为参数,因为这意味着每个goroutine都拷贝一份wg,每个goroutine都使用自己的wg。这显然是不合理的,这3个goroutine应该共享一个wg,才能知道这3个goroutine都完成了。实际上,如果使用值类型的参数,main goroutine将会永久阻塞而导致产生死锁。

以上就是“Go中的WaitGroup怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go中的WaitGroup怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go中的WaitGroup怎么使用

今天小编给大家分享一下Go中的WaitGroup怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正常情况下,新激活的g
2023-06-30

Go语言的WaitGroup怎么使用

本篇内容介绍了“Go语言的WaitGroup怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!小试牛刀我们先来个简单的例子,看下 Wai
2023-07-02

如何在 Go 中使用WaitGroup同步 Goroutine?

如何在 Go 中使用 WaitGroup 同步 Goroutine?什么是 WaitGroup?WaitGroup 是 Go 中的一个内置类型,用于协调并发操作,它可以用来确保一组 goroutine 在执行完毕之前不会继续执行。如何
如何在 Go 中使用WaitGroup同步 Goroutine?
2024-05-15

Go语言中goroutine和WaitGroup如何使用

本篇内容主要讲解“Go语言中goroutine和WaitGroup如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言中goroutine和WaitGroup如何使用”吧!Go语言中g
2023-07-05

go同步协程的必备工具WaitGroup怎么使用

本篇内容主要讲解“go同步协程的必备工具WaitGroup怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go同步协程的必备工具WaitGroup怎么使用”吧!1. 简介本文将介绍 Go
2023-07-05

Go语言中goroutine和WaitGroup的使用示例详解

goroutine是Go中一个轻量级的线程,只需要一个go关键字就可以创建一个goroutine,这篇文章主要介绍了Go语言中goroutine和WaitGroup的使用,需要的朋友可以参考下
2023-03-03

Go WaitGroup的使用方式及实例详解

WaitGroup 是 Go 语言的一个并发控制机制,它可以用于等待一组 goroutine 的结束。WaitGroup 提供了三个方法:Add、Done 和 Wait。1. Add 方法:用于设置 WaitGroup 中等待的 gorou
2023-10-12

Golang中的并发控制和Go WaitGroup

在Golang中,可以使用并发控制来管理多个goroutine的执行。其中,一个常见的并发控制机制是使用`sync.WaitGroup`。`sync.WaitGroup`是Golang标准库中的一个结构体,用于等待一组goroutine执行
2023-10-08

如何使用Go WaitGroup处理并发任务

在 Go 中使用 `sync.WaitGroup` 来处理并发任务,可以确保在所有任务完成之前等待主程序的执行。下面是一个简单的例子:```gopackage mainimport ("fmt""sync")func main() {var
2023-10-09

高效并发编程实践:Golang中的Go WaitGroup使用技巧

在Golang中,WaitGroup是一个并发原语,可以用于等待一组goroutine完成任务。下面是一些使用WaitGroup的技巧,以实现高效并发编程。1. 创建WaitGroup对象:首先,需要创建一个WaitGroup对象,通常使用
2023-10-08

Go中Waitgroup和锁的示例分析

这篇文章给大家分享的是有关Go中Waitgroup和锁的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。学 Go 的时候知道 Go 语言支持并发,最简单的方法是通过 go 关键字开启 goroutine 即
2023-06-15

Go WaitGroup简介及在Golang中的应用领域

WaitGroup是Go语言中的一个并发原语,用于等待一组Go协程完成任务。它提供了一种简单的方式来同步多个并发任务的完成。WaitGroup的主要功能包括三个方法:- Add(delta int):用于向WaitGroup中添加或减少等待
2023-10-08

使用Go WaitGroup实现高效并发处理任务

在Go语言中,可以使用`sync`包中的`WaitGroup`类型来实现高效并发处理任务。`WaitGroup`是一个计数信号量,用于等待一组goroutine完成任务。它提供了三个方法:`Add()`、`Done()`和`Wait()`。
2023-10-12

基础教程:Go WaitGroup及其在Golang中的应用

在Golang中,WaitGroup是一种用于等待一组goroutine完成执行的机制。它可以用来确保在主goroutine结束之前,所有的子goroutine都已经执行完毕。要使用WaitGroup,首先需要导入`sync`包。然后,可以
2023-10-08

Golang中的数据并发处理和Go WaitGroup

Golang中的数据并发处理可以通过使用goroutine和channel来实现。Goroutine是一种轻量级的线程,可以在函数前添加go关键字来启动一个goroutine。Channel是用于goroutine之间进行通信和数据传递的数
2023-10-08

高并发RPC:使用Go WaitGroup实现分布式调用

在Go中,可以使用sync包中的WaitGroup来实现高并发RPC的分布式调用。WaitGroup是一个计数器,用于等待一组goroutine完成。当计数器的值变为0时,表示所有的goroutine已经完成。下面是一个使用WaitGrou
2023-10-12

巨大数据集处理:使用Go WaitGroup优化性能

在处理巨大数据集时,使用Go的WaitGroup可以帮助优化性能。WaitGroup是Go语言中用于等待一组goroutine完成任务的机制。下面是使用WaitGroup优化性能的基本步骤:1. 创建WaitGroup对象:在开始处理数据集
2023-10-12

Go中的Context怎么使用

这篇“Go中的Context怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go中的Context怎么使用”文章吧。1
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录