golang中同步方式
golang中有2种方式同步程序
- 一种使用channel
- 另一种使用锁机制。
sync.WaitGroup方法
sync.WaitGroup只有3个方法:
- Add()
- Done()
- Wait()
其中Done()是Add(-1)的别名。
简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
要注意的有一点。sync文档已经说明了的,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.也就是说,在运行main函数的goroutine里运行Add()函数,在其他的goroutine里面运行Done()函数。这个我是踩过雷了的。
最简单的案例就是sync文档里面的example,这里简单写了一个例子。
package main
import (
"fmt"
"time"
"sync"
)
var wg sync.WaitGroup
func main() {
for i := 0; i < 100; i++ {
wg.Add(1)
go fun(i)
}
fmt.Println("exit")
wg.Wait()
}
func fun(i int) {
time.Sleep(time.Second * 2)
fmt.Println(i)
wg.Done()
}
网友评论