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完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!