Golang 程序中使用 sync.WaitGroup 同步多个 Goroutine

栏目: Go · 发布时间: 7年前

内容简介:编写并发的程序时,经常会遇到需要同步多个协程/线程的状态/数据的问题。在 Golang 程序中同步多个 Goroutine 的最简单的办法就是使用 sync.WaitGroup。下面是官网的介绍:从中我们可以提取出几点关键信息:

编写并发的程序时,经常会遇到需要同步多个协程/线程的状态/数据的问题。在 Golang 程序中同步多个 Goroutine 的最简单的办法就是使用 sync.WaitGroup。

下面是官网的介绍:

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.

从中我们可以提取出几点关键信息:

  1. WaitGroup 可以用于等待一系列的 Goroutine 完成任务;
  2. Add 方法须在 main goroutine 中调用;
  3. Done 方法须在其它新建的 goroutine 中调用;
  4. Wait 方法可以阻塞等待直至其它 goroutine 完成;
Talk is cheap. Show me the code.
package main

import (
    "fmt"
    "sync"
    "time"
)

func TaskA(wg *sync.WaitGroup) {
    defer wg.Done()
    time.Sleep(1 * time.Second)
    fmt.Println("task a done...")
}

func TaskB(wg *sync.WaitGroup) {
    defer wg.Done()
    time.Sleep(3 * time.Second)
    fmt.Println("task b done...")
}

func TaskC(wg *sync.WaitGroup) {
    defer wg.Done()
    time.Sleep(5 * time.Second)
    fmt.Println("task c done...")
}

func main() {
    var wg sync.WaitGroup

    //开启一个 goroutine 前,在 main goroutine 中调用 wg.Add
    //为什么强调一定要在 main goroutine 中调用 wg.Add,而不能在
    //新建的 goroutine 中调用呢?我的理解是如果延迟到新建的
    //goroutine 中调用 wg.Add 就有可能造成 wg.Wait 先执行。若是
    //如此,必定不能达到如期的效果。
    wg.Add(1)
    //传递给 goroutine 的 WaitGroup 变量必须为指针类型,因为在
    //Golang 中所有的函数参数都是值传递,也就是在函数体内会复制一
    //份参数的副本。如果不使用指针类型就无法引用到同一个 WaitGroup
    //变量,便也不能依赖 WaitGroup 来实现同步了。
    go TaskA(&wg)

    wg.Add(1)
    go TaskC(&wg)

    wg.Add(1)
    go TaskB(&wg)

    //阻塞等待直至所有其它的 goroutine 都已执行完毕
    wg.Wait()
    fmt.Println("all the tasks done...")
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

天涯虚拟社区

天涯虚拟社区

刘华芹 / 民族出版社 / 2005-11 / 23.00元

网络空间很复杂,好多人并不完全了解或者只是了解到一些皮毛。比如说好多人对于见网友一事总是抱着浪漫或者暖昧的想法,而事实却并不总是想象的那样。作者在做虚拟社区研究甚至是在有这个想法之前并不常呆在网上,互联网对于作者来说就是查查资料、收发信年、看看新闻的工具。担是看着越来越多的人把时间花在网上,一处文化上的直觉告诉作者:有一种新的生活方式产生了。强烈的好奇心驱使着作者走到了网上,走到了天涯虚拟社区,并......一起来看看 《天涯虚拟社区》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具