概述
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相关所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复