Go語言的WaitGroup是用來等待一組goroutine執(zhí)行完畢的工具,可以用來實現(xiàn)任務(wù)隊列。下面是一個使用WaitGroup實現(xiàn)任務(wù)隊列的示例代碼:
package main
import (
"fmt"
"sync"
)
func main() {
// 創(chuàng)建一個WaitGroup
var wg sync.WaitGroup
// 創(chuàng)建一個帶緩沖的任務(wù)隊列
queue := make(chan string, 10)
// 啟動三個goroutine來處理任務(wù)
for i := 0; i < 3; i++ {
// 增加WaitGroup的計數(shù)
wg.Add(1)
// 啟動一個goroutine來處理任務(wù)
go worker(i, queue, &wg)
}
// 向任務(wù)隊列中添加任務(wù)
for i := 0; i < 10; i++ {
queue <- fmt.Sprintf("Task %d", i)
}
// 關(guān)閉任務(wù)隊列
close(queue)
// 等待所有g(shù)oroutine執(zhí)行完畢
wg.Wait()
}
func worker(id int, queue chan string, wg *sync.WaitGroup) {
// 在函數(shù)退出時,減少WaitGroup的計數(shù)
defer wg.Done()
// 不斷從任務(wù)隊列中獲取任務(wù),并處理任務(wù)
for task := range queue {
fmt.Printf("Worker %d processing task: %s\n", id, task)
}
}
上面的代碼中,首先創(chuàng)建了一個WaitGroup和一個帶緩沖的任務(wù)隊列。然后啟動了三個goroutine來處理任務(wù)。每個goroutine都會從任務(wù)隊列中獲取任務(wù)并處理。最后,通過調(diào)用Wait方法等待所有g(shù)oroutine執(zhí)行完畢。
在主函數(shù)中,通過循環(huán)向任務(wù)隊列中添加任務(wù),并在添加完畢后關(guān)閉任務(wù)隊列。這樣所有的goroutine就會在任務(wù)隊列為空時退出,并通過調(diào)用Done方法減少WaitGroup的計數(shù)。
需要注意的是,在worker函數(shù)中,通過defer關(guān)鍵字來調(diào)用Done方法,以保證在函數(shù)退出時一定會調(diào)用Done方法。這樣可以避免在處理任務(wù)過程中發(fā)生異常導(dǎo)致WaitGroup計數(shù)無法減少的問題。
通過上述代碼,可以實現(xiàn)利用Go WaitGroup實現(xiàn)任務(wù)隊列的功能。每個任務(wù)會被分配給可用的goroutine進行處理,從而實現(xiàn)并發(fā)執(zhí)行。