- 方法1:channel实现
/**
1 channel通信实现
*/
var sync1 = make(chan int)
// 实际任务
func cal(no int) {
fmt.Printf("%d 计算中\n", no)
sync1 <- no
}
func main() {
count := 5
for i := 0; i < 5; i++ {
go cal(i)
}
// 在go中,channel未关闭之前,主go程不会结束
for range sync1 {
count--
// 当将所有值从channel中取出后,关闭sync1通道
if count == 0 {
close(sync1)
}
}
fmt.Println("cal end...")
}
- 方法2:WaitGroup实现
/**
2 等待组实现
*/
var wg sync.WaitGroup
func cal2(no int) {
fmt.Printf("%d 计算中\n", no)
wg.Done() // 计时器-1
}
func main() {
wg.Add(5) // 计时器+5
for i := 0; i < 5; i++ {
go cal2(i)
}
// 阻塞直到等待组的计时器为0
wg.Wait()
fmt.Println("CAL END...")
}