开发过程中,经常遇到task之间的同步问题。例如,多个子task并发完成一部分任务,主task等待他们最后结束。

在Go语言,实现同步的一种方式就是WaitGroup。

Example

package main 

import (
"fmt"
"sync"
"time"
) func main() { var wg sync.WaitGroup wg.Add(3)
go func(n int){
fmt.Println("n:", n)
t := time.Duration(n)*time.Second
time.Sleep(t) wg.Done()
}(1) go func(n int){
fmt.Println("n:", n)
t := time.Duration(n)*time.Second
time.Sleep(t)
time.Sleep(t) wg.Done()
}(2) go func(n int){
fmt.Println("n:", n)
t := time.Duration(n)*time.Second
time.Sleep(t) wg.Done()
}(3) wg.Wait() fmt.Println("main exit...")
}

output:

n: 3

n: 1

n: 2

main exit...

注意

WaitGroup变量定义后,是不允许被拷贝的,即不允许作为函数参数或者赋值给其他变量。

Go 并发控制--WaitGroup的使用的更多相关文章

  1. Go并发控制--WaitGroup篇

    目录 1. 前言 2. 使用WaitGroup控制 2.1 使用场景 2.2 信号量 1.3 WaitGroup 数据结构 2.3.1 Add () 方法 2.3.2 Wait() 2.3.3 Don ...

  2. Go并发控制--Channel篇

    目录 1. 前言 2. 使用channel控制子协程 2.1 使用场景 2.2 总结 1. 前言 我们考虑这么一种场景,协程A执行过程中需要创建子协程A1.A2.A3-An,协程A创建完子协程后就等待 ...

  3. Go并发控制之sync.WaitGroup

    WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...

  4. Go并发控制--context的使用

    并发控制 Cancel Example 通过使用WithCancel可以取消一个或多个goroutine的执行,以实现对并发的控制. package main import ( "conte ...

  5. goroutine并发控制与通信

    转发:https://mp.weixin.qq.com/s/ZlyQHfmoY1lzOoRgFSCOBw 开发go程序的时候,时常需要使用goroutine并发处理任务,有时候这些goroutine是 ...

  6. 并发控制--context篇

    目录 1. 前言 2 Context 实现原理 2.1 接口定义 2.1 cancelCtx 2.1.1 Done()接口实现 2.1.2 Err()接口实现 2.1.3 cancel()接口实现 2 ...

  7. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  8. EntityFramework与TransactionScope事务和并发控制

    最近在园子里看到一篇关于TransactionScope的文章,发现事务和并发控制是新接触Entity Framework和Transaction Scope的园友们不易理解的问题,遂组织此文跟大家共 ...

  9. MySQL MVCC(多版本并发控制)

    概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...

随机推荐

  1. 7-log4j2之自定义Appender

    一.添加Maven依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</grou ...

  2. 2019-03-19-day014-内置函数

    昨日回顾 装饰器 对扩展开放 对修改封闭 不改变原调用方式 def a(c): def b(*args,**kwargs): c(*args,**kwargs) return b a() def a( ...

  3. ipython output logging:使用日志记录输出

    通常使用ipython的%logstart日志功能时,仅开启输入的记录. 例如在ipython中开启%logstart后,记录的日志文件内容如下: #!/usr/bin/env python # 20 ...

  4. nwjs 解决手指可滑动问题

    package.json 中添加: "chromium-args": "--touch-events --enable-touch-drag-drop",

  5. h5 手机端适配问题汇总

    1.uc手机浏览器竟然没有 sessionstorage 醉了 2.opera 浏览器  能识别 a标签中href的  javascript:; 为网址  ,  55555 3.safari 的弹框如 ...

  6. python文件读写小结

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

  7. TensorRT caffemodel serialize

    1.TensorRT的需要的文件 需要的基本文件(不是必须的) 1>网络结构文件(deploy.prototxt) 2>训练的权重模型(net.caffemodel) TensorRT 2 ...

  8. multi-thread debug

    1.不要去解锁一个未被加锁的mutex锁: 2.不要一个线程中加锁而在另一个线程中解锁: 3.使用mutex锁用于保护临界资源,严格按照“加锁-->写入/读取临界资源-->解锁”的流程执行 ...

  9. 通过web.config来自定义output caching缓存

    我们服务器有开启缓存功能, 缓存功能可以减少您访问网站时候网站在服务器里面的编译时间, 大大加快您网站的访问速度, 如果您需要对您网站进行频繁更新的话, 您可以考虑暂时将缓存时间减少,或者暂时关闭缓存 ...

  10. lesson5rnns-fastai

    32min 如何确定embedding个数即嵌入矩阵容量?:不确定:与文本的字数关系不大,关键是语言的复杂度和需要解决的问题类型 embedding的效果要比one hot编码的效果好