golang sync WaitGroup

u011511092 · 2014-10-04 19:26:12 · 31038 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2014-10-04 19:26:12 的文章,其中的信息可能已经有所发展或是发生改变。

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。

先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。

WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。

Add:添加或者减少等待goroutine的数量

Done:相当于Add(-1)

Wait:执行阻塞,直到所有的WaitGroup数量变成0

例子:

package main

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

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i = i + 1 {
		wg.Add(1)
		go func(n int) {
			// defer wg.Done()
			defer wg.Add(-1)
			EchoNumber(n)
		}(i)
	}

	wg.Wait()
}

func EchoNumber(i int) {
	time.Sleep(3e9)
	fmt.Println(i)
}

输出结果:

0
1
2
3
4

程序很简单,只是将每次循环的数量过3秒钟输出。那么,这个程序如果不用WaitGroup,那么将看不见输出结果。因为goroutine还没执行完,主线程已经执行完毕。注释的defer wg.Done()和defer wg.Add(-1)作用一样。这个很好,原来执行脚本,都是使用time.Sleep,用一个估计的时间等到子线程执行完。WaitGroup很好。虽然chanel也能实现,但是觉得如果涉及不到子线程与主线程数据同步,这个感觉不错。

文章来自:http://www.liguosong.com/2014/05/06/golang-sync-waitgroup/


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u011511092

查看原文:golang sync WaitGroup

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

31038 次点击  
加入收藏 微博
7 回复  |  直到 2018-11-07 18:54:45
nalan
nalan · #1 · 7年之前

这种文章居然还留着...真是祸害人

Schr0dingerCat
Schr0dingerCat · #2 · 7年之前

这个难道是错的?

KenmyZhang
KenmyZhang · #3 · 7年之前
Schr0dingerCatSchr0dingerCat #2 回复

这个难道是错的?

你把代码拷贝到电脑上编译运行下就知道了

Hnuster
Hnuster · #4 · 7年之前

wg.wait(); 需要上移到for循环里面

kkkygm
kkkygm · #5 · 7年之前

没毛病

fwhez
fwhez · #6 · 7年之前

楼主是要表达 wg.Add(-1) 和wg.Done()效果一致吗

qinghai5060
qinghai5060 · #7 · 6年之前

作者写的没毛病。上移到循环里面只是能实现顺序执行,失去了goroutine的意义了,如果是这样还不如不用goroutine。wait.Wait()加到循环外才是设计的初衷。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传