go 使用 - sync.WaitGroup

使用 - sync.WaitGroup

    • 简介
    • 使用注意点

简介

waitgroup 是等待一组并发操作完成得方法。

Goroutines对Go来说是独一无二的(尽管其他一些语言有类似的并发原语)。它们不是操作系统线程,它们不完全是绿色的线程(由语言运行时管理的线程),它们是更高级别的抽象,被称为协程(coroutines)。协程是非抢占的并发子程序,也就是说,它们不能被中断。 《Concurrency in Go 》

使用注意点

  • Add() 数 与 Done() 数 需要一致, 成对调用
  • Wait 方法用于等待所有协程执行完毕, 必须保证wait 在 add 之后, 不能让wait 和 add 有发生数据竞态的可能。 原因可看源码解读。
// 正确使用
wg.Add(1) 
go func(){
	defer wg.Done()
	...
}
wg.Wait()

// 产生数据竞态条件, 错误使用
go func(){
	wg.Add(1) 
	defer wg.Done()
	...
}
// wait 可能都没有阻塞, 因为add没有执行
wg.Wait()

  • 希望将wg 传入函数内部使用, 需要传地址
wg.Add(workers)
for i:= 0;i < workers; i++{
	go deal(&wg, i)
}
wg.Wait()

func deal(index int, wg *sync.WaitGroup){
	defer wg.Done()
	...
}

sync.WaitGroup 源码解读

你可能感兴趣的:(go语言,golang,开发语言)