非同時制御のインスタンス解析: GoのWaitGroupによるタスク実行
Go言語では、syncパッケージのWaitGroupを使用して並行処理を制御することができます。WaitGroupは、goroutineのグループが実行を終えるのを待ちます。
WaitGroup を使ってタスクを完了させる例を以下に示します。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 设置要执行的任务数量
taskCount := 5
wg.Add(taskCount)
for i := 1; i <= taskCount; i++ {
go performTask(i, &wg)
}
// 等待所有任务完成
wg.Wait()
fmt.Println("所有任务已完成")
}
func performTask(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("开始执行任务 %d\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("任务 %d 完成\n", id)
}
上記の例では、最初にWaitGroupインスタンスwgを作成してから、実行するタスク数を5に設定し、wg.Add(taskCount)メソッドを呼び出して待機中のgoroutine数を増やします。
次に、ループを使用して5つのgoroutineを作成し、各goroutineのタスクIDとWaitGroupインスタンスへのポインターをperformTask関数に渡します。
performTask 関数では、defer キーワードを使用して、関数が実行された後に wg.Done() メソッドを必ず呼び出し、タスクが完了したことを示します。
各ゴルーチン内で、まずタスク開始を示す情報をプリントし、time.Sleep関数を使ってタスク実行時間を模擬します。最後に、タスク完了を示す情報をプリントします
最後にwg.Wait()メソッドを呼び出して、すべてのゴー程がタスクを完了するのを待機します。すべてのゴー程がwg.Done()メソッドを呼び出すと、Waitメソッドは戻り、プログラムは後のコードの実行を続けます。
上記コードを実行すると、次のような出力が表示されます。
开始执行任务 1
开始执行任务 2
开始执行任务 3
开始执行任务 4
开始执行任务 5
任务 3 完成
任务 1 完成
任务 4 完成
任务 5 完成
任务 2 完成
所有任务已完成
出力より5つのタスクが並列実行されたことがわかりますが、最後の出力ではそのすべてのタスクが完了していることがわかります。
WaitGroupを利用したタスクの並行性を制御することで、全てのgoroutineが完了するまで主goroutineは待機できます。これは、一連のgoroutine完了を待ってから後続の処理を実行したい場合に役立ちます。