美文网首页
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包装

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

  • golang sync WaitGroup

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

  • golang语言异步通信之WaitGroup

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

  • (八)golang WaitGroup 源码分析

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

  • golang sync WaitGroup

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

  • Golang的WaitGroup陷阱

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

  • golang 基础(30) WaitGroup

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

  • golang 基础(22)WaitGroup

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

  • golang 系列:waitgroup 解析

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

  • golang - sync.WaitGroup

    go 版本基于1.18 结构体 结构体定义如下: 当我们初始化一个WaitGroup对象时,其counter值、w...

网友评论

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

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