>  기사  >  백엔드 개발  >  Golang 함수는 WaitGroup을 통해 고루틴이 완료될 때까지 어떻게 기다리나요?

Golang 함수는 WaitGroup을 통해 고루틴이 완료될 때까지 어떻게 기다리나요?

王林
王林원래의
2024-05-01 09:51:01652검색

WaitGroup은 Go루틴 실행을 조정하기 위한 Go의 동기화 메커니즘입니다. 이를 사용하여 실행을 계속하기 전에 기본 고루틴이 고루틴 그룹이 완료될 때까지 기다리도록 합니다. 구체적인 사용법: WaitGroup 인스턴스를 생성하고 대기할 고루틴 수를 나타내는 초기 카운터를 설정합니다. 기다릴 각 고루틴에 대해 wg.Add(1)을 호출하여 카운터를 증가시킵니다. 고루틴이 완료된 후 wg.Done()을 호출하여 카운터를 감소시킵니다. 마지막으로 기본 고루틴은 wg.Wait()를 호출하여 모든 고루틴이 완료될 때까지 자체를 차단합니다.

Golang 함수는 WaitGroup을 통해 고루틴이 완료될 때까지 어떻게 기다리나요?

WaitGroup을 사용하여 Go에서 고루틴이 완료될 때까지 기다리는 방법

Go에서 WaitGroup은 여러 고루틴의 실행을 조정하는 데 사용되는 동기화 메커니즘입니다. 이를 통해 기본 고루틴은 고루틴 그룹이 완료될 때까지 기다릴 수 있으므로 실행을 계속하기 전에 모든 관련 작업이 완료되었는지 확인할 수 있습니다. 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

🎜사용법: 🎜🎜🎜 WaitGroup 인스턴스를 생성하고 대기할 고루틴 수를 나타내는 초기 카운터를 설정합니다. 대기할 각 고루틴에 대해 wg.Add(1)를 호출하여 카운터를 증가시키고, 고루틴이 완료되면 wg.Done()을 호출하여 카운터를 감소시킵니다. 마지막으로 기본 고루틴은 wg.Wait()를 호출하여 모든 고루틴이 완료될 때까지 자신을 차단합니다. 🎜🎜🎜코드 샘플: 🎜🎜
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")
}
🎜🎜실용 사례: 🎜🎜🎜이 코드 샘플은 요청을 처리하기 위해 여러 고루틴을 시작하는 간단한 웹 서버를 시뮬레이션합니다. 서버를 종료하기 전에 고루틴이 완료되었는지 확인하기 위해 WaitGroup을 사용하여 모든 고루틴이 완료될 때까지 기다립니다. 🎜아아아아

위 내용은 Golang 함수는 WaitGroup을 통해 고루틴이 완료될 때까지 어떻게 기다리나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.