美文网首页
golang积累-WaitGroup包装

golang积累-WaitGroup包装

作者: 晓亮1988 | 来源:发表于2020-03-08 23:40 被阅读0次

    在看NSQ源码时看到封装了waitgroup方法,很实用,于是网上找了一篇文章,顺带整个流程熟悉一遍

    golang的协程使用非常方便,但是为了确保协程能在主程序退出之前确保执行,会使用各种手段。

    笨点的time大法:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func foo() {
        fmt.Println("foo")
    }
    func main() {
        go foo()
        time.Sleep(time.Second)
    }
    
    

    稍微好点的通道阻塞

    package main
    
    import "fmt"
    
    var channel = make(chan int)
    
    func foo() {
        fmt.Println("fooooo")
        // 传递一个完成信号
        channel<-1
    }
    func main() {
        go foo()
    
        // 读取 完成操作
        <-channel
    }
    

    聪明点的,使用sync.WaitGroup

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func foo() {
        fmt.Println("fooo")
    }
    
    func foo1() {
        fmt.Println("fooo11111")
    }
    
    func foo2() {
        fmt.Println("fooo222222")
    }
    func main() {
        var wg sync.WaitGroup
    
        wg.Add(1)
        go func() {
            foo()
            wg.Done()
        }()
    
        wg.Add(1)
        go func() {
            foo1()
            wg.Done()
        }()
    
        wg.Add(1)
        go func() {
            foo2()
            wg.Done()
        }()
    
        fmt.Println("main")
    
        wg.Wait()
    }
    

    没有了全局变量,代码这样写的代码看起来很臃肿,继续优化一下

    封装WaitGroup Wrapper

    /nsq/xiaoliang/util/wg.go

    package util
    
    import "sync"
    
    type WaitGroupWrapper struct {
        sync.WaitGroup
    }
    
    func (wg *WaitGroupWrapper) Wrap(f func()) {
        wg.Add(1)
        go func() {
            f()
            wg.Done()
        }()
    }
    

    封装waitgroup代码

    /nsq/xiaoliang/xiaoliang.go

    package main
    
    import (
        "fmt"
        "github.com/nsqio/nsq/xiaoliang/util"
    )
    
    func main() {
        var w util.WaitGroupWrapper
    
        w.Wrap(func() {
            fmt.Println("fooo")
        })
    
        w.Wrap(func() {
            fmt.Println("foo1111")
        })
    
        w.Wrap(func() {
            fmt.Println("foo2222")
        })
    
        w.Wait()
    
    }
    

    封装后的代码,简洁了好多

    相关文章

      网友评论

          本文标题:golang积累-WaitGroup包装

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