golang 基础(30) WaitGroup

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

golang_real.jpg

golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。

func main(){
    go foo()
    go bar()
}

func foo(){
    for i := 0; i < 45; i++{
        fmt.Println("Foo",i)
    }
}

func bar(){
    for i := 0; i < 45; i++{
        fmt.Println("Bar:",i)
    }
}

var wg sync.WaitGroup

func main(){
    wg.Add(2)
    go foo()
    go bar()
    wg.Wait()
}

func foo(){
    for i := 0; i < 45; i++{
        fmt.Println("Foo",i)
    }
    wg.Done()
}

func bar(){
    for i := 0; i < 45; i++{
        fmt.Println("Bar:",i)
    }
    wg.Done()
}
th (1).jpg

waitGroup 添加 2 两个然后直到执行到 0 ,排序是不确定,这里复习一下接口引用的调用方式。

func (wg *WaitGroup) Add(delta int)

package main

import(
    "fmt"
    "math"
)

type circle struct{
    radius float64
}

type shape interface{
    area() float64
}

func (c *circle) area() float64{
    return math.Pi * c.radius * c.radius
}

func info(s shape){
    fmt.Println("area",s.area())
}

func main()  {
    c := circle{5}
    info(c)

}
circle does not implement shape (area method has pointer receiver)
func main()  {
    c := &circle{5}
    info(c)

}

在 go 语言中可以为一个常量 42 定义时候指定类型或者不指定类型。在定义类型时候在 go 语言还不确定是否分配内存,所以在接受指针类型的情况我们不能使用值传递。

func foo(){
    for i := 0; i < 45; i++{
        fmt.Println("Foo",i)
        time.Sleep(time.Duration(3.*time.Millisecond))
    }
    wg.Done()
}

func bar(){
    for i := 0; i < 45; i++{
        fmt.Println("Bar:",i)
        time.Sleep(time.Duration(20.*time.Millisecond))
    }
    wg.Done()
}

加入休眠,当任务休眠时候,空闲下来 CPU 就可以去处理其他任务。


th (3).jpg
concurrency_vs_parallelism.jpeg

从图可以清晰地看出 concurrency 和 parallelism 的区别,一个恰当实例就是我们喝咖啡和谈话,concurrency 就是类似我们一边和咖啡一边打电话。类似同时进行,切实是在两者之间不断切换。

th (2).jpg

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

本文来自:简书

感谢作者:zidea

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

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

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