返回顶部
首页 > 资讯 > 精选 >Go中的WaitGroup怎么使用
  • 709
分享到

Go中的WaitGroup怎么使用

2023-06-30 04:06:29 709人浏览 安东尼
摘要

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

今天小编给大家分享一下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怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Go中的WaitGroup怎么使用

本文链接: https://lsjlt.com/news/327388.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go中的WaitGroup怎么使用
    今天小编给大家分享一下Go中的WaitGroup怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正常情况下,新激活的g...
    99+
    2023-06-30
  • Go语言的WaitGroup怎么使用
    本篇内容介绍了“Go语言的WaitGroup怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!小试牛刀我们先来个简单的例子,看下&nbs...
    99+
    2023-07-02
  • Go语言中goroutine和WaitGroup如何使用
    本篇内容主要讲解“Go语言中goroutine和WaitGroup如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言中goroutine和WaitGroup如何使用”吧!Go语言中g...
    99+
    2023-07-05
  • 如何在 Go 中使用WaitGroup同步 Goroutine?
    如何在 Go 中使用 WaitGroup 同步 Goroutine? 什么是 WaitGroup? WaitGroup 是 Go 中的一个内置类型,用于协调并发操作,它可以用来确保一组...
    99+
    2024-05-15
    go
  • go同步协程的必备工具WaitGroup怎么使用
    本篇内容主要讲解“go同步协程的必备工具WaitGroup怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go同步协程的必备工具WaitGroup怎么使用”吧!1. 简介本文将介绍 Go ...
    99+
    2023-07-05
  • Go语言中goroutine和WaitGroup的使用示例详解
    目录Go语言中goroutine和WaitGroup的使用介绍例子扩展:Go的goroutine与sync.WaitGroup的初步使用Go语言中goroutine和WaitGrou...
    99+
    2023-03-03
    go goroutine和WaitGroup使用 go goroutine和WaitGroup
  • Go WaitGroup的使用方式及实例详解
    WaitGroup 是 Go 语言的一个并发控制机制,它可以用于等待一组 goroutine 的结束。WaitGroup 提供了三个...
    99+
    2023-10-12
    Go语言
  • Go并发控制WaitGroup的使用场景分析
    1. 前言 上一篇介绍了 Go并发控制--Channel 使用channel来控制子协程的优点是实现简单,缺点是当需要大量创建协程时就需要有相同数量的channel,而且对于子协程继...
    99+
    2024-04-02
  • Go中Waitgroup和锁的示例分析
    这篇文章给大家分享的是有关Go中Waitgroup和锁的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。学 Go 的时候知道 Go 语言支持并发,最简单的方法是通过 go 关键字开启 goroutine 即...
    99+
    2023-06-15
  • Golang中的并发控制和Go WaitGroup
    在Golang中,可以使用并发控制来管理多个goroutine的执行。其中,一个常见的并发控制机制是使用`sync.WaitGrou...
    99+
    2023-10-08
    Golang
  • 高效并发编程实践:Golang中的Go WaitGroup使用技巧
    在Golang中,WaitGroup是一个并发原语,可以用于等待一组goroutine完成任务。下面是一些使用WaitGroup的技...
    99+
    2023-10-08
    Golang
  • 如何使用Go WaitGroup处理并发任务
    在 Go 中使用 `sync.WaitGroup` 来处理并发任务,可以确保在所有任务完成之前等待主程序的执行。下面是一个简单的例子...
    99+
    2023-10-09
    Golang
  • Go WaitGroup简介及在Golang中的应用领域
    WaitGroup是Go语言中的一个并发原语,用于等待一组Go协程完成任务。它提供了一种简单的方式来同步多个并发任务的完成。Wait...
    99+
    2023-10-08
    Golang
  • 基础教程:Go WaitGroup及其在Golang中的应用
    在Golang中,WaitGroup是一种用于等待一组goroutine完成执行的机制。它可以用来确保在主goroutine结束之前...
    99+
    2023-10-08
    Golang
  • 解决Golang 中使用WaitGroup的那点坑
    sync.WaitGroup对于Golang开发者来说并不陌生,其经常作为多协程之间同步的一种机制。用好它势必会让你事半功倍,但是一旦错用将引发问题。 关于WaitGroup的使用网...
    99+
    2024-04-02
  • Golang中的数据并发处理和Go WaitGroup
    Golang中的数据并发处理可以通过使用goroutine和channel来实现。Goroutine是一种轻量级的线程,可以在函数前...
    99+
    2023-10-08
    Golang
  • Golang中的任务并发执行和Go WaitGroup
    在Golang中,任务的并发执行可以通过goroutine和channel来实现。Goroutine是轻量级的线程,可以并发执行多个...
    99+
    2023-10-09
    Golang
  • 高并发RPC:使用Go WaitGroup实现分布式调用
    在Go中,可以使用sync包中的WaitGroup来实现高并发RPC的分布式调用。WaitGroup是一个计数器,用于等待一组gor...
    99+
    2023-10-12
    Go语言
  • 高效并发编程:使用Go WaitGroup和协程池
    在Go语言中,可以使用WaitGroup和协程池来实现高效的并发编程。1. WaitGroup:WaitGroup是一个计数器,用于...
    99+
    2023-10-08
    Golang
  • 使用Go WaitGroup实现高效并发处理任务
    在Go语言中,可以使用`sync`包中的`WaitGroup`类型来实现高效并发处理任务。`WaitGroup`是一个计数信号量,用...
    99+
    2023-10-12
    Go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作