介绍golang中sync.WaitGroup的使用

介绍

在使用golang过程中,经常会启动很多个go协程。然而如何方便地等待这些协程的结束呢?

这里介绍一个struct 那就是WaitGroup

WaitGroup 总共有3 个函数:

  1. Add(delta int) 添加计数
  2. Done() 减少计数
  3. Wait() 等待计数等于0

注: Done() 其实就是Add(-1)

使用

  1. 每启动一个goroutine 时,调用Add 函数计数加一。
  2. 每结束一个goroutine 时,调用Done 函数计数减一。

示例 waitgroup.go

package main

import (
	"net/http"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	var urls = []string{
		"http://www.baidu.com/",
		"http://www.somestupidname.com/",
	}
	for _, url := range urls {
		// 添加WaitGroup 计数器.
		wg.Add(1)
		// 运行一个协程去获取 URL.
		go func(url string) {
			// 当协程结束时,计数器减一
			defer wg.Done()
			// 获取 URL.
			http.Get(url)
		}(url)
	}
	// 等待所有url获取完成
	wg.Wait()
}

humboldt Written by:

humboldt 的趣味程序园