Golang並發程式設計:使用Go WaitGroup實作任務調度器
WaitGroup內部維護了一個計數器,用來記錄未完成的任務數量。當呼叫Add方法時,計數器加上指定的值;當呼叫Done方法時,計數器減1;當呼叫Wait方法時,如果計數器大於0,當前goroutine會被阻塞,直到計數器歸零。
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting ", id) time.Sleep(time.Second) fmt.Printf("Worker %d done ", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("All workers done") }
在這個範例中,我們使用一個for循環啟動5個worker goroutine,並透過呼叫wg.Add(1)來將任務數量加入WaitGroup。在worker函數中,使用defer關鍵字來確保在函數傳回前呼叫wg.Done(),來減少計數器的值。最後,使用wg.Wait()來等待所有任務完成。
Worker 1 starting Worker 2 starting Worker 3 starting Worker 4 starting Worker 5 starting Worker 3 done Worker 1 done Worker 2 done Worker 5 done Worker 4 done All workers done
可以看到,所有的worker goroutine被並發執行,但是輸出的順序不一定是按照啟動順序來的,這是因為goroutine的調度是由Go運行時進行的。
透過本文的介紹和範例程式碼,相信你對如何使用Golang的WaitGroup實現任務調度器有了更深的理解。希望本文對你學習和使用Golang的並發程式設計有幫助!
以上是Golang並發程式設計:使用Go WaitGroup實現任務調度器的詳細內容。更多資訊請關注PHP中文網其他相關文章!