美文网首页
Go 优雅的退出程序

Go 优雅的退出程序

作者: parker7 | 来源:发表于2018-10-18 16:54 被阅读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()
        }()
    }
    

    总结

    下一遍文章深入sync.WaitGroup实现原理

    Github Wait Demo

    相关文章

      网友评论

          本文标题:Go 优雅的退出程序

          本文链接:https://www.haomeiwen.com/subject/pkkszftx.html