golang 基础(30) WaitGroup

作者: zidea | 来源:发表于2019-04-03 07:54 被阅读12次
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

相关文章

  • golang 基础(30) WaitGroup

    golang中有2种方式同步程序,一种使用channel,另一种使用锁机制。sync.WaitGroup只有3个方...

  • golang 基础(22)WaitGroup

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

  • golang sync WaitGroup

    刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:...

  • golang语言异步通信之WaitGroup

    golang语言异步通信之WaitGroup 简介 WaitGroup的用途是使得主线程一直阻塞等待直到所有相关的...

  • (八)golang WaitGroup 源码分析

    1 前言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术。WaitGroup,可理解为Wai...

  • Golang sync.WaitGroup基础用法

    程序输出如下,

  • golang sync WaitGroup

    简介 它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。...

  • Golang的WaitGroup陷阱

    sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例...

  • golang积累-WaitGroup包装

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

  • golang 系列:waitgroup 解析

    摘要 Golang 提供了简洁的 go 关键字来让开发者更容易的进行并发编程,同时也提供了 WaitGroup 对...

网友评论

    本文标题:golang 基础(30) WaitGroup

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