Go语言并发控制:深入理解和使用WaitGroup

需积分: 5 0 下载量 174 浏览量 更新于2024-10-29 收藏 908B ZIP 举报
资源摘要信息:"Go语言的并发控制工具WaitGroup使用详解" Go语言是一种支持并发的编程语言,它通过goroutine来实现轻量级的并发。然而,在并发程序中,我们经常需要等待一组goroutine全部完成后再继续执行,这时候就需要用到sync包中的WaitGroup。WaitGroup提供了等待一组操作完成的同步机制,是并发编程中常用的一个同步原语。 WaitGroup使用三个主要的方法:Add, Done和Wait。 1. Add方法用于设置计数器的值。需要等待的goroutine数量应该被设置为计数器的初始值。如果设置为0,则Wait方法会立即返回,表示没有goroutine需要等待。 2. Done方法用于在goroutine完成其工作后进行通知。它的作用相当于将计数器减1。它是一个无参数并且没有返回值的方法。 3. Wait方法阻塞调用它的goroutine直到WaitGroup的计数器值减为0。如果计数器的值已经是0,则Wait方法不会发生阻塞。 下面是一个使用WaitGroup的简单示例代码: ```go package main import ( "fmt" "sync" "sync/atomic" "time" ) var counter int32 func main() { var wg sync.WaitGroup var urls = []string{ "***", "***", "***", } for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() // 假设这里进行某种网络请求操作 resp, err := http.Get(url) if err != nil { log.Fatal(err) } // 假设这里处理响应 // ... atomic.AddInt32(&counter, 1) }(url) } wg.Wait() fmt.Println("所有goroutine都执行完毕") fmt.Println("访问的网站数量为:", counter) } ``` 在这个例子中,我们创建了一个WaitGroup实例wg,并对每个将要启动的goroutine调用wg.Add(1)来增加计数器的值。每个goroutine完成工作后,通过调用wg.Done()来减少计数器的值。主goroutine通过调用wg.Wait()来等待所有goroutine完成。 需要注意的是,WaitGroup实例必须在引用它的goroutine之外进行声明,并且应该只在goroutine间共享,而不能复制这个实例。这是因为WaitGroup不是并发安全的数据结构。 WaitGroup还有两个重要的特性需要注意: - 如果在调用Wait方法时计数器的值已经是0,即没有任何goroutine在等待,则该方法会立即返回,不会产生阻塞。 - 为了避免潜在的死锁情况,我们不应该复制WaitGroup实例,而应该通过传递它的地址来共享。 以上就是关于Go语言中WaitGroup的基本知识点和使用方法。掌握好WaitGroup的正确用法对于编写高效且正确的并发程序至关重要。