実践的なプロジェクト:GoのWaitGroupを使ってGolangの並行処理のパフォーマンスを向上させる

非同期処理を効率化するために、Goではsync.WaitGroupを使用できます。sync.WaitGroupは、グループのgoroutineの実行完了を待つためのカウント信号量です。

以下に、複数のウェブページの内容をダウンロードするために sync.WaitGroup を使用する例を示します:

package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
urls := []string{
"https://www.google.com",
"https://www.baidu.com",
"https://www.github.com",
}
var wg sync.WaitGroup
wg.Add(len(urls))
for _, url := range urls {
go func(url string) {
defer wg.Done()
resp, err := http.Get(url)
if err != nil {
fmt.Printf("Failed to download %s: %s\n", url, err)
return
}
defer resp.Body.Close()
fmt.Printf("Downloaded %s\n", url)
}(url)
}
wg.Wait()
}

このサンプルでは、まず sync.WaitGroup を作成し、 wg.Add(len(urls)) を使用してカウンタの初期値を設定します。次に、ループを使用して複数のゴリルーチンを作成し、それらを使用してウェブページのコンテンツをダウンロードします。各ゴリルーチン内で、defer wg.Done() を使用して sync.WaitGroup カウンタから 1 を減らします。最後に、 wg.Wait() を呼び出すと、すべてのゴリルーチンが完了するまで待機します。

sync.WaitGroup を利用することで、全ての goroutine が完了したことを確認してから後続のロジックを実行できます。これにより、複数のウェブページコンテンツを同時にダウンロードして、各コンテンツのダウンロード完了を待ってから次のコンテンツに進む必要がないため、並行処理性能を向上できます。

さらに、sync.WaitGroupの使用は、コンカレンシータスクのより良い管理に役立ち、Go言語のコンカレンシーパフォーマンスを向上させます。

bannerAds