Go 优雅的退出程序

180it 2020-11-02 PM 2383℃ 0条

前言:在实际开发中,有时候我们需要等待某个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()
    }()
}

作者:parker7
链接:https://www.jianshu.com/p/2dc4c953fddb

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

Go 优雅的退出程序