前言:在实际开发中,有时候我们需要等待某个goroutine执行完毕或者几个goroutine执行完毕才退出主程序
1.采用时间延时
2.采用chan
3.采用WaitGroup
1.采用时间延时
如果我们知道业务函数结束时间,可以使用这种方式。
当我们不知道业务函数处理结束时间,这就很尴尬。
func main() {
go foo()
time.Sleep(3 * time.Second)
}
func foo() {
fmt.Println("foo begin.")
// 模拟业务耗时,这里在3秒后退出foo方法
for{
fmt.Println("foo run.")
time.Sleep(3 * time.Second)
break
}
fmt.Println("foo end.")
}
2.采用chan
采用官方推荐goroutine间通信机制完成,也是可以的,但是当goroutine多的时候就不太好处理
func main() {
test2()
}
func test2(){
var sig = make(chan int)
go func() {
foo()
sig <- 1
}()
<-sig
}
3.采用WaitGroup
采用官方WaitGroup机制,可以有效等待所以的goroutine结束,才退出主程序
func main() {
test3()
//test4()
}
func test3(){
var wg sync.WaitGroup
wg.Add(1)
go func() {
foo()
wg.Done()
}()
wg.Wait()
}
// 进一步封装WaitGroup,缩减通用代码方便使用
func test4(){
var wgw WaitGroupWrapper
wgw.Wrap(foo)
wgw.Wait()
}
type WaitGroupWrapper struct {
sync.WaitGroup
}
func (wgw * WaitGroupWrapper)Wrap(f func()){
wgw.Add(1)
go func() {
f()
wgw.Done()
}()
}
总结
下一遍文章深入sync.WaitGroup实现原理
网友评论