首頁  >  文章  >  後端開發  >  golang函數如何透過WaitGroup等待goroutine完成?

golang函數如何透過WaitGroup等待goroutine完成?

王林
王林原創
2024-05-01 09:51:01653瀏覽

WaitGroup 是 Go 中一種用於協調 goroutine 執行的同步機制。使用它可以確保主 goroutine 等待一組 goroutine 完成後再繼續執行。具體用法:建立 WaitGroup 實例,並為它設定一個初始計數器,表示要等待的 goroutine 數。對於每個要等待的 goroutine,呼叫 wg.Add(1) 來增加計數器。在 goroutine 完成後,呼叫 wg.Done() 來減少計數器。最後,主 goroutine 呼叫 wg.Wait() 來阻塞自身,直到所有 goroutine 都已完成。

golang函數如何透過WaitGroup等待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完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn