标签:wg WaitGroup 协程 fmt 主线 用法 func go
go基础 - WaitGroup用法
package main
import (
"fmt"
"sync"
"time"
)
/**
* Created by Goland
* User: wkk alisleepy@hotmail.com
* Time: 2022/8/15 - 23:33
* Desc: <描述信息>
*/
func main() {
fmt.Println("主线程 start。。")
// 1、协程练习
//goroutineTest()
// 2、协程执行结束,主线程再结束,需要用到 WaitGroup
var wg sync.WaitGroup // 定义一个wg
waitGroupTest(&wg)
wg.Wait() // 阻塞状态,直到所有的协程执行完成,然后再继续执行主线程
fmt.Println("主线程 end。。")
}
/*------------------------ goroutine start ---------------------------*/
func goroutineTest() {
fmt.Println("协程练习 start...")
// 开启1000个协程
for i := 0; i < 1000; i++ {
// 匿名函数,闭包
//go func(i int) {
// fmt.Printf("打印数字:%d\n", i)
//}(i)
// 调用方法
go P(i)
}
// sleep2秒,保证协程全部执行完成,再执行主线程
time.Sleep(2 * time.Second) // 如果没有这个,可能会主线程执行结束退出,开启的协程也自动退出
fmt.Println("协程练习 end...")
}
func P(i int) {
fmt.Printf("打印数字:%d\n", i)
}
/*------------------------ goroutine end ---------------------------*/
/*------------------------ waitGroup start ---------------------------*/
/**
Add(n int) :每次开启协程前调用该方法,计数器+1
Done() :协程每次执行完成后调用该方法,计数器-1
Wait() : 主线程中调用该方法,使得主线程等待中,阻塞主线程执行,直到所有线程全部执行完成,计数器 = 0,然后不再阻塞主线程
*/
func waitGroupTest(wg *sync.WaitGroup) {
for i := 0; i < 10000; i++ {
// 每次新开启goroutine,先add 加 1
wg.Add(1)
go wp(i, wg)
}
}
func wp(i int, wg *sync.WaitGroup) {
// 每次执行完协程中的任务,执行done方法,表示执行完成
defer wg.Done() // 防止漏写Done方法,可以通过defer写在前边,在执行完之后及时Done
fmt.Printf("打印数字:%d\n", i)
}
/*------------------------ waitGroup end ---------------------------*/
标签:wg,WaitGroup,协程,fmt,主线,用法,func,go 来源: https://www.cnblogs.com/alisleepy/p/16590175.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。