GoのWaitGroupを使った実践的な例-シンプルで実用的

WaitGroupは、Go言語における同期プリミティブであり、goroutineのグループが完了するのを待つために使用されます。

以下にWaitGroupを使ったgoroutine群を待つ簡単なアプリケーションの例を示します。

package main
import (
"fmt"
"sync"
"time"
)
// 模拟耗时操作,每个goroutine等待一秒钟
func doSomething(i int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Goroutine %d start\n", i)
time.Sleep(time.Second)
fmt.Printf("Goroutine %d done\n", i)
}
func main() {
var wg sync.WaitGroup
// 启动5个goroutine
for i := 0; i < 5; i++ {
wg.Add(1)
go doSomething(i, &wg)
}
// 等待所有goroutine完成
wg.Wait()
fmt.Println("All goroutines done")
}

上記の例では、非同期処理をシミュレートするdoSomething関数を定義しました。main関数では、WaitGroupを作成し、非同期処理を開始する前にAddメソッドを呼び出してカウンタを増やしました。

その後、各ゴルーチンは doSomething 関数を実行し、完了したら Done メソッドを呼び出してカウンタをデクリメントします。

最後に、すべてのgoroutineの実行が完了するまでWaitメソッドを呼び出して待機します。カウントがゼロになったら、Waitメソッドは戻り、プログラムは実行を継続します。

上記のコードを実行すると、以下のような出力が表示されます:

Goroutine 0 start
Goroutine 1 start
Goroutine 2 start
Goroutine 3 start
Goroutine 4 start
Goroutine 0 done
Goroutine 2 done
Goroutine 3 done
Goroutine 4 done
Goroutine 1 done
All goroutines done

出力によると、すべての goroutine が完了して、最後に「All goroutines done」と表示されている。

WaitGroupを使用することで、goroutine の完了を容易に待機することができ、プログラムの実行順序や並行性を制御できます。これは、並行プログラミングにおいて非常に一般的で、実用的なテクニックです。

bannerAds