golang 基础(22)WaitGroup

zidea · · 550 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

square-gopher.png

waitGroup 从字面上来看是等待组,好处是主线程的退出或执行需要其之前所有 goroutine 执行完毕才回到主线程执行,这是保证所有的 goroutine 都会被执行到

···

import (
    "fmt"
    "time"
    "sync"
)

func doSomething(millisecs time.Duration, wg *sync.WaitGroup){
    duration := millisecs * time.Millisecond
    time.Sleep(duration)
    fmt.Println("Function in background, duration:", duration)
    wg.Done()
}

func main(){
    var wg sync.WaitGroup
    wg.Add(4)
    go doSomething(200, &wg)
    go doSomething(400, &wg)
    go doSomething(150, &wg)
    go doSomething(600, &wg)

    wg.Wait()
    fmt.Println("Done")
}

为发生我们添加多余 wg 造成 deadlock 好的的喜欢写一个 goroutine 就 Add 一次。

func main(){
    var wg sync.WaitGroup
    wg.Add(1)
    go dosomething(200, &wg)
    wg.Add(1)
    go dosomething(400, &wg)
    wg.Add(1)
    go dosomething(150, &wg)
    wg.Add(1)
    go dosomething(600, &wg)

    wg.Wait()
    fmt.Println("Done")
}
Function in background, duration: 150ms
Function in background, duration: 200ms
Function in background, duration: 400ms
Function in background, duration: 600ms
Done

如果我们 wg.Add 数量超出了现有 goroutine 个数就会发生 deadlock! 错误

wg.Add(5)
fatal error: all goroutines are asleep - deadlock!
gophercloud.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:golang 基础(22)WaitGroup

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

550 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传