GO教程: Go 語言等待組(sync.WaitGroup)
在並行編程中,管理多個執行緒的生命週期是一項重要的任務。Go 語言提供了一個強大的工具來處理這個問題,那就是 sync.WaitGroup。這個結構可以幫助我們等待一組 goroutine 完成,從而簡化了並行程式的控制流。
什麼是 sync.WaitGroup?
sync.WaitGroup 是 Go 語言標準庫中的一個結構,位於 sync 包中。它的主要功能是跟踪一組 goroutine 的完成狀態。當我們啟動多個 goroutine 時,可以使用 WaitGroup 來確保主程式在所有 goroutine 完成之前不會退出。
如何使用 sync.WaitGroup
使用 sync.WaitGroup 的基本步驟如下:
- 創建一個
WaitGroup實例。 - 在啟動每個 goroutine 之前,調用
Add方法來增加計數。 - 在每個 goroutine 完成時,調用
Done方法來減少計數。 - 在主程式中,調用
Wait方法來阻塞,直到計數為零。
範例程式碼
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 確保在函數結束時減少計數
fmt.Printf("Worker %d startingn", id)
time.Sleep(time.Second) // 模擬工作
fmt.Printf("Worker %d donen", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 增加計數
go worker(i, &wg) // 啟動 goroutine
}
wg.Wait() // 等待所有 goroutine 完成
fmt.Println("All workers done")
}
在這個範例中,我們創建了五個 goroutine,每個 goroutine 都會模擬一段工作時間。主程式會在所有 goroutine 完成之前保持運行,確保所有工作都已完成。
sync.WaitGroup 的注意事項
- 計數必須正確:在使用
Add和Done時,必須確保計數的正確性。如果Add的次數與Done的次數不匹配,將會導致Wait永遠阻塞。 - 不要在 goroutine 中使用 WaitGroup:應避免在 goroutine 中調用
Wait,因為這會導致死鎖。 - 使用 defer:在 goroutine 中使用
defer wg.Done()是一個良好的習慣,這樣可以確保即使發生錯誤也能正確減少計數。
總結
在 Go 語言中,sync.WaitGroup 是一個非常有用的工具,可以幫助開發者有效地管理多個 goroutine 的執行。通過正確使用 Add、Done 和 Wait 方法,我們可以確保主程式在所有工作完成之前不會退出。這對於需要並行處理的應用程式來說,無疑是一個重要的功能。
如果您正在尋找高效的 香港VPS 解決方案,Server.HK 提供多種選擇,適合各種需求。無論是開發環境還是生產環境,我們的 伺服器 都能為您提供穩定的支持。