Goにおける concurrency(並行処理):Go WaitGroupを使用したジョブスケジューラのインプリメンテーション
タスクスケジューラは一般的な並行プログラミングパターンで、複数のタスクを同時に実行し、すべてのタスクが完了するまで他の操作の実行を待機するために使用されます。 Goでは、sync.WaitGroupを使用してタスクスケジューラを実装できます。
WaitGroupはGo言語が提供する並行プリミティブで、一連のgoroutineが完了するまで待機するために使用されます。3つのメソッド、Add()、Done()、Wait()が提供されています。
以下に、sync.WaitGroup を使用してタスクスケジューラを実装したサンプルコードを示します。
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个WaitGroup对象
var wg sync.WaitGroup
// 设置任务的数量
numTasks := 10
wg.Add(numTasks)
// 并发执行任务
for i := 0; i < numTasks; i++ {
go func(taskId int) {
// 执行任务
fmt.Printf("Task %d is running\n", taskId)
// 标记任务完成
wg.Done()
}(i)
}
// 等待所有任务完成
wg.Wait()
// 所有任务完成后执行其他操作
fmt.Println("All tasks have been completed")
}
上記のコードでは、まずsync.WaitGroupオブジェクトを作成します。次に、Add()メソッドを呼び出して実行するタスクの数を設定します。続いて、ループ処理によってタスクを並行実行し、各タスクが完了するとDone()メソッドを呼び出してタスクの完了をマークします。最後に、Wait()メソッドを呼び出すことで、すべてのタスクが完了するのを待ちます。
上記のコードを実行すると、以下のような出力が得られます。
Task 0 is running
Task 1 is running
Task 2 is running
Task 3 is running
Task 4 is running
Task 5 is running
Task 6 is running
Task 7 is running
Task 8 is running
Task 9 is running
All tasks have been completed
すべてのタスクが完了すると、プログラムは他の操作を実行し続けることがわかります。
同期待ち対応のタスクスケジューラが実装しやすく、複数の並列タスクを管理してすべて完了するまで待つことが可能になります。並列処理やバッチ処理などのシーンで実装に便利です。