waitgroup 是 go 中一种用于协调 goroutine 执行的同步机制。使用它可以确保主 goroutine 等待一组 goroutine 完成后再继续执行。具体用法:创建 waitgroup 实例,并为它设置一个初始计数器,表示要等待的 goroutine 数。对于每个要等待的 goroutine,调用 wg.add(1) 来增加计数器。在 goroutine 完成后,调用 wg.done() 来减少计数器。最后,主 goroutine 调用 wg.wait() 来阻塞自身,直到所有 goroutine 都已完成。
如何使用 WaitGroup 在 Go 中等待 Goroutine 完成
Go 中的 WaitGroup
是一种同步机制,用于协调多个 goroutine 的执行。它允许主 goroutine 等待一组 goroutine 完成,从而确保在继续执行之前所有相关任务都已完成。
用法:
创建一个 WaitGroup
实例,并为其设置一个初始计数器,表示要等待的 goroutine 数。对于每个要等待的 goroutine,调用 wg.Add(1)
来增加计数器,并在 goroutine 完成后调用 wg.Done()
来减少计数器。最后,主 goroutine 调用 wg.Wait()
来阻塞自身,直到所有 goroutine 都已完成。
代码示例:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { // 创建一个需要等待 3 个 goroutine 完成的 WaitGroup wg.Add(3) // 创建 3 个 goroutine for i := 0; i < 3; i++ { go func(i int) { fmt.Printf("Goroutine %d started\n", i) // 模拟一些需要时间的工作 for j := 0; j < 10000; j++ {} fmt.Printf("Goroutine %d finished\n", i) // 通知 WaitGroup 该 goroutine 已完成 wg.Done() }(i) } // 等待所有 goroutine 完成 wg.Wait() fmt.Println("All goroutines have finished") }
登录后复制
实战案例:
此代码示例模拟了一个简单的 Web 服务器,该服务器会启动多个 goroutine 来处理请求。为了确保在关闭服务器之前 goroutine 已完成,我们使用 WaitGroup
来等待所有 goroutine 完成。
package main import ( "fmt" "net/http" "sync" ) var wg sync.WaitGroup func main() { // 创建一个需要等待所有 HTTP 请求完成的 WaitGroup wg.Add(10) // 监听端口 8080 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") // 请求处理完毕后,通知 WaitGroup wg.Done() }) http.ListenAndServe(":8080", nil) // 等待所有 HTTP 请求完成 wg.Wait() fmt.Println("All HTTP requests have been processed") }
登录后复制
以上就是golang函数如何通过WaitGroup等待goroutine完成?的详细内容,更多请关注其它相关文章!