waitGroup
add():产生每个goroutine时累加器加1。
done():每个goroutine内部的完成销毁时减小计数。
wait():等待所有add的goroutine都执行完,计数为0时触发。
缓存channel
不可保证顺序
非缓存channel
可以保证顺序
package main
import (
"fmt"
_ "net/http/pprof"
"time"
)
//var wg sync.WaitGroup
var ch = make(chan int, 10)
var ch2 = make(chan int)
func main() {
/*go等待一组协程结束的实现方式*/
// go提供了sync包和channel来解决协程同步和通讯。
//for i := 0; i < 10; i++ {
// wg.Add(1)
// go task(i)
//}
//wg.Wait()
// 利用缓冲信道channel协程之间通讯,其阻塞等待功能实现等待一组协程结束,不能保证其goroutine按照顺序执行
//
//for i := 0; i < 10; i++ {
// go task2(i)
//}
//
//for j := 0; j < 10; j++ {
// <- ch
//}
//
//time.Sleep(time.Second)
//
//fmt.Println("game over")
// 利用无缓冲的信道channel协程之间通讯,其阻塞等待功能实现等待一组协程结束,保证了其goroutine按照顺序执行
for i := 0; i < 10; i++ {
go task3(i)
<-ch2
}
time.Sleep(time.Second)
fmt.Println("game over")
}
func task3(i int) {
fmt.Println("task i : ", i)
ch2 <- i
}
func task2(i int) {
fmt.Println("task i : ", i)
ch <- i
}
func task(i int) {
fmt.Println("task i : ", i)
//wg.Done()
}