如果你刚接触Go语言并且想用它构建高并发,高性能的应用,弄明白WaitGroups是怎么回事很重要。

在本教程中,我们将掌握以下内容:

  • WaitGroups的用途
  • 一个WaitGroups的简单示例

学习完本教程,你将会对WaitGroups有个全面的了解并且可以在你的高并发go应用中使用它。

理解WaitGroups

接下来我们就来看一下WaitGroups是什么以及它能为我们解决什么问题

当你在程序中使用go语言的协程的时候,在协程执行完成之前,你需要阻塞程序的执行。

请看以下代码示例 :

 package main

 import (
"fmt"
) func main() {
fmt.Println("Hello World")
go myFunc()
fmt.Println("Finished Execution")
} func myFunc() {
fmt.Println("Inside my goroutine")
}

程序输出如下:

Hello World
Finished Execution

我们发现,程序并没有输出"Inside my goroutine",原因是主程序在协程执行之前就已经退出了。

如何解决?使用WaitGroups

WaitGroups可以通过阻塞主函数来帮我们解决上面的问题。

请看以下代码:

 package main

 import (
"sync"
5 "fmt"
) func main() {
fmt.Println("Hello World")
var waitgroup sync.WaitGroup
waitgroup.Add(1)
go myFunc(&waitgroup)
waitgroup.Wait() fmt.Println("Finished Execution")
} func myFunc(waitgroup *sync.WaitGroup) {
fmt.Println("Inside my goroutine")
waitgroup.Done()
}

上面代码输出结果为:

Hello World
Inside my goroutine
Finished Execution

达到了我们想要的结果。

接下来对上面的代码做一些解释:

我们在开启协程之前,先调用了WaitGroup的Add(1)方法,是要设置主函数需要等待完成的协程数为1,Wait()方法是等待协程的完成。我们在协程中调用的WaitGroup的Done()方法,意思是当前协程执行完成(Done()做的工作其实就是把需要等待的协程个数减1),当需要等待的协程数为0时,则不需要再等待,继续执行以下的代码。

改造成匿名函数

我们可以把上面的例子改造成匿名函数的,代码如下:

package main

import (
"sync"
"fmt"
) func main() {
fmt.Println("Hello World")
var waitgroup sync.WaitGroup
waitgroup.Add(1)
go func(){
fmt.Println("Inside my goroutine")
waitgroup.Done()
}()
waitgroup.Wait() fmt.Println("Finished Execution")
}

上面代码输出结果依然为:

Hello World
Inside my goroutine
Finished Execution

关于go语言中的WaitGroup的更多相关文章

  1. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  2. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  3. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  4. C语言中do...while(0)的妙用(转载)

    转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

  5. C语言中,定义的含义?声明的含义?它们之间的区别是什么?

    在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

  6. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  7. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  8. c语言中time相关函数

    工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...

  9. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

随机推荐

  1. linux增加自己的可执行目录 $PATH

    Linux中有三种方法可以添加用户的路径到系统路径PATH, 以添加 /etc/apache/bin 为例: 方法一: 直接在命令行中输入: #PATH=$PATH:/etc/apache/bin 这 ...

  2. virtualbox+vagrant学习-2(command cli)-14-vagrant reload命令

    Reload 格式: vagrant reload [vm-name] 其等价于在运行vagrant up命令后接着运行vagrant halt 要使在Vagrantfile文件中所做的更改生效,通常 ...

  3. Sequelize-nodejs-11-Raw queries

    Raw queries原始查询 就是使用了原始的查询语句,如UPDATE users SET y = 42 WHERE x = 12 As there are often use cases in w ...

  4. python基础整理3——前端

    html概述和基本结构 html概述 HTML意思是超文本标记语言 html基本结构 一个html的基本结构如下: <!DOCTYPE html> <html lang=" ...

  5. [转]Apache HTTP Server 与 Tomcat 的三种连接方式介绍

    首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...

  6. RANSAC与 最小二乘(LS, Least Squares)拟合直线的效果比较

    代码下载地址: 1.Matlab版本:http://pan.baidu.com/s/1eQIzj3c.进入目录后,请自行定位到该博客的源代码与数据的目录“

  7. 文件上传 python

    def upload(): r = requests.post( url='http://upload.renren.com/upload.fcgi?pagetype=addpublishersing ...

  8. $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  9. N个数中第k个最大者

    #include<stdio.h> #include<stdlib.h> void bubbleSort(int arr[],int n) { int i,j; ;i>; ...

  10. [外观] Firemonkey Windows Hint 气球样式

    Firemonkey 在 Windows 平台下的 Hint 默认为距形,有些单调,现在只要加入一行代码,就可以有气球箭头样式的 Hint. 修改代码: 请将 FMX.Controls.Win.pas ...