您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    在 Go 言语中管理 Concurrency 的三种方式
    时间:2020-08-12 12:07 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    置信大家踏入 Go 言语的世界,一定是被弱小的并发(Concurrency)所吸引,Go 言语用最复杂的关键字go就可以将义务丢到后台处置,但是开发者怎样有效率的控制并发,这是入门 Go 言语必学的技艺,本章会引见几种方式来带大家看法并发,而这三种方式辨别对应到三个不同的名词:WaitGroup,Channel,及 Context。下面用复杂的范例带大家了解。

    在 Go 言语中管理 Concurrency 的三种方式

    WaitGroup

    先来了解有什么情境需求运用到 WaitGroup,假定您有两台机器需求同时上传最新的代码,两台机器辨别上传完成后,才能执行最后的重启步骤。就像是把一个任务同时拆成好几份同时一同做,可以增加时间,但是最后需求等到全部做完,才能执行下一步,这时分就需求用到 WaitGroup 才能做到。

    package main 

     

    import ( 

        "fmt" 

        "sync" 

     

    func main() { 

        var wg sync.WaitGroup 

        i := 0 

        wg.Add(3) //task count wait to do 

        go func() { 

            defer wg.Done() // finish task1 

            fmt.Println("goroutine 1 done"

            i++ 

        }() 

        go func() { 

            defer wg.Done() // finish task2 

            fmt.Println("goroutine 2 done"

            i++ 

        }() 

        go func() { 

            defer wg.Done() // finish task3 

            fmt.Println("goroutine 3 done"

            i++ 

        }() 

        wg.Wait() // wait for tasks to be done 

        fmt.Println("all goroutine done"

        fmt.Println(i) 

    Channel

    另外一种实践的案例就是,我们需求自动通知一个 Goroutine 停止中止的举措。换句话说,当 App 启动时,会在后台跑一些监控顺序,而当整个 App 需求中止前,需求发个 Notification 给后台的监控顺序,将其先中止,这时分就需求用到 Channel 来通知。看下下面这个例子:

    package main 

     

    import ( 

        "fmt" 

        "time" 

     

    func main() { 

        exit := make(chan bool) 

        go func() { 

            for { 

                select { 

                case <-exit: 

                    fmt.Println("Exit"

                    return 

                case <-time.After(2 * time.Second): 

                    fmt.Println("Monitoring"

                } 

            } 

        }() 

        time.Sleep(5 * time.Second

        fmt.Println("Notify Exit"

        exit <- true //keep main goroutine alive 

        time.Sleep(5 * time.Second

    (责任编辑:admin)