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

转载:https://blog.csdn.net/cj_286/article/details/79538505

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

原文:https://blog.csdn.net/cj_286/article/details/79538505

版权声明:本文为博主原创文章,转载请附上博文链接!