go等待一组协程结束的实现方式

go提供了sync包和channel来解决协程同步和通讯。

方式1:

sync.WaitGroup是等待一组协程结束,sync.WaitGroup只有3个方法,Add()添加一个计数,Done()减去一个计数,Wait()阻塞直到所有任务完成。

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup //定义一个同步等待的组

func task(i int){
	fmt.Println("task...",i)
	//耗时操作任务,网络请求,读取文件
	time.Sleep(time.Second)
	wg.Done() //减去一个计数
}

func main(){
	for i:= 0;i<10;i++{
		wg.Add(1) //添加一个计数
		go task(i)
	}
	wg.Wait() //阻塞直到所有任务完成
	fmt.Println("over")
}
运行结果:
task... 9
task... 4
task... 6
task... 0
task... 7
task... 5
task... 1
task... 2
task... 8
task... 3

over

方式2:

利用缓冲信道channel协程之间通讯,其阻塞等待功能实现等待一组协程结束,不能保证其goroutine按照顺序执行

package main

import (
	"fmt"
)

var ch = make(chan int,10)

func task(i int){
	fmt.Println("task...",i)
	ch <- i
}

func main(){
	for i:= 0;i<10;i++{
		go task(i)
	}
	for i:= 0;i<10;i++{
		<- ch
	} 
	fmt.Println("over")
}
运行结果:
task... 9
task... 0
task... 1
task... 2
task... 6
task... 7
task... 3
task... 4
task... 8
task... 5

over

方式3:

利用无缓冲的信道channel协程之间通讯,其阻塞等待功能实现等待一组协程结束,保证了其goroutine按照顺序执行

package main

import (
	"fmt"
	"time"
)

var ch = make(chan int)

func task(i int){
	fmt.Println("task...",i)
	time.Sleep(time.Second)
	 <- ch
}

func main(){
	for i:= 0;i<10;i++{
		go task(i)
		ch <- i
	}
	fmt.Println("over")
}
运行结果:
task... 0
task... 1
task... 2
task... 3
task... 4
task... 5
task... 6
task... 7
task... 8
task... 9
over

你可能感兴趣的:(Go)