golang – waitgroup用法示例
最近的博客会陆续写一些Golang的简单内容,分享一些常见的用法和经验。
今天要写的就是并发任务处理。
在Golang中经常需要并发处理N个任务并且等待全部完成,这时候可以优先考虑使用Golang提供的WaitGroup库解决。
基本用法
下面是一个基本示例,在启动并发处理之前Add(1)增加任务计数,在任务处理完成后调用Done()方法减少任务计数,启动所有的任务后调用Wait()等待计数减少为0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import ( "fmt" "sync" "time" ) func main() { wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { time.Sleep(1) fmt.Println("finish") wg.Done() }() } wg.Wait() } |
但是通常来说,主协程和并发协程之间要有数据往来,所以说WaitGroup通常要与闭包函数结合起来用,以便得到并发协程的处理结果。
下面我举一个简单例子。
结合闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package main import ( "fmt" "sync" ) func main() { wg := sync.WaitGroup{} result := make([]bool, 10) for i := 0; i < 10; i++ { wg.Add(1) go func(idx int) { result[idx] = true wg.Done() }(i) } wg.Wait() fmt.Println(result) } |
为了收集并发协程的处理结果,我模拟创建了一个bool数组,由各个协程直接保存各自结果到对应下标。
最后Wait()返回后说明所有协程均已退出,此时就可以放心的打印result结果数组了。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
