目录

Waitgroup用法

1 main线程不知道gorutine什么时候退出

为了让main线程不在 gorutine运行过程中就退出,用time.Sleep(time.Second),保证main线程不立即退出

1
2
3
4
5
6
7
func main() {
	for i := 0; i < 100; i++ {
		go fmt.Println(i)
	}
	time.Sleep(time.Second)
}

2 channel同步信号量

实际开发中,往往难以预测orutine的运行时间,最好的方式是,函数运行完就给出一个信号,可以使用channel来作为程序的同步信号量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func main() {
	c := make(chan bool,100)
	for i := 0; i < 100; i++ {
		go func(i int) {
			fmt.Println(i)
			c <- true
		}(i)
	}

	for i:=0;i<100;i++{
		<- c
	}
}

3 WaitGroup 等待一组任务完成

使用channel来作为程序的同步信号量并不是最好的方式,go提供了一个工具sync.WaitGroupWaitGroup内部维护了一个计数器,它有三个方法,分别是Add()、done()、wait()Add(n) 把计数器设置为nDone() 每次把计数器-1wait() 会阻塞代码的运行,直到计数器地值减为0。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func main() {
	wg := sync.WaitGroup{}  //内部有一个计数器
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go func(i int) {
			fmt.Println(i)
			wg.Done()
		}(i)
	}
	wg.Wait()

}
  • WaitGroup对象通过函数传值时,必须传地址
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func fucprint(i int,wg *sync.WaitGroup) {
	fmt.Println(i)
	wg.Done()
}


func main() {
	wg := sync.WaitGroup{} 
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go fucprint(i,&wg)
	}
	wg.Wait()
}