转载: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 版权声明:本文为博主原创文章,转载请附上博文链接!
|
请发表评论