Goコンカレンシープログラミング: Go WaitGroupを使用してタスクキューを実装する

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`とバッファ付きのタスクキューを作成し、タスクを処理するために3つのgoroutineを開始する。それぞれのgoroutineはタスクキューからタスクを取得して処理し、最後に`Wait`メソッドを呼ぶことですべてのgoroutineの終了を待つ。

メイン関数のなかでタスクをタスクキューに追加するためのループ実行後、タスクキューを閉じる。これによりすべてのgoroutineがタスクキューが空になると終了し、WaitGroupのカウンタが Doneメソッド呼び出しによって減少する。

worker 関数で Done メソッドを呼び出す際には defer を用いて、関数が途中で抜けても必ず Done メソッドが呼び出されるようにする必要があります。これは、ワーカーの処理中にエラーが発生した場合に WaitGroup のカウンタが解決されなくなる問題を回避するためです。

上記のコードでは、GoのWaitGroupを使用してタスクキューを実装しています。各タスクは使用可能なgoroutineに割り当てられ処理され、これによって並行実行が実現しています。

bannerAds