海印网
海印网

golang函数如何通过WaitGroup等待goroutine完成?

admin数码120

waitgroup 是 go 中一种用于协调 goroutine 执行的同步机制。使用它可以确保主 goroutine 等待一组 goroutine 完成后再继续执行。具体用法:创建 waitgroup 实例,并为它设置一个初始计数器,表示要等待的 goroutine 数。对于每个要等待的 goroutine,调用 wg.add(1) 来增加计数器。在 goroutine 完成后,调用 wg.done() 来减少计数器。最后,主 goroutine 调用 wg.wait() 来阻塞自身,直到所有 goroutine 都已完成。

golang函数如何通过WaitGroup等待goroutine完成?-第1张图片-海印网

如何使用 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完成?的详细内容,更多请关注其它相关文章!

Tags: 计数器都已

Sorry, comments are temporarily closed!