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