我是靠谱客的博主 天真向日葵,最近开发中收集的这篇文章主要介绍Goroutine的sync.WaitGroup相关,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

func test() {
    for i := 0; i < 10; i++ {
        fmt.println("test() 你好golang", i)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    go test()
    for i := 0; i < 10; i++ {
        fmt.Println("main() 你好golang", i)
        time.Sleep(time.Millisecond * 50)
    }
}


结果:
main() 你好golang 0
test() 你好golang 0
main() 你好golang 1
test() 你好golang 1
main() 你好golang 2
main() 你好golang 3
test() 你好golang 2
main() 你好golang 4
main() 你好golang 5
test() 你好golang 3
main() 你好golang 6
main() 你好golang 7
test() 你好golang 4
main() 你好golang 8
main() 你好golang 9
test() 你好golang 5

可以看出协程还没有执行完就已经结束了,这是因为主进程已经执行完了,它不管协程的死活

在代码编程时要多注意这个问题

解决方案一:

在主进程结束前阻塞一段时间等待协程的结束

func test() {
    for i := 0; i < 10; i++ {
        fmt.println("test() 你好golang", i)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    go test()
    for i := 0; i < 10; i++ {
        fmt.Println("main() 你好golang", i)
        time.Sleep(time.Millisecond * 50)
    }

    time.Sleep(time.Millisecond * 1000)
}

但是在实际的工程中,我们无法知道协程什么时候结束,这样盲目的添加阻塞,势必是不可行的

解决方案二:

使用sync.WaitGroup

var wg sync.WaitGroup

func test() {
    for i := 0; i < 10; i++ {
        fmt.println("test() 你好golang", i)
        time.Sleep(time.Millisecond * 100)
    }
    wg.Done()    //协程计数器减1
}

func main() {
    wg.Add()    //协程计数器加1
    go test()
    for i := 0; i < 10; i++ {
        fmt.Println("main() 你好golang", i)
        time.Sleep(time.Millisecond * 50)
    }

    wg.Wait()    //等待协程计数器清零
}

 

最后

以上就是天真向日葵为你收集整理的Goroutine的sync.WaitGroup相关的全部内容,希望文章能够帮你解决Goroutine的sync.WaitGroup相关所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部