見出し画像

golang WaitGroupの使い方と注意点

Go言語のsync.WaitGroupは複数のゴルーチンの完了を待機するために使用される非常に便利なツールです。
これを使うことで、主ゴルーチンが複数の並行処理が全て終了するまで待機することができます。


WaitGroupの使い方

インポートと初期化

sync.WaitGroupを使用するためには、syncパッケージをインポートし、WaitGroupを初期化する必要があります。

import "sync"

var wg sync.WaitGroup


ゴルーチンの起動前にカウンタをインクリメント

ゴルーチンを起動する前にWaitGroupのカウンタをインクリメントします。これは、待機する必要があるゴルーチンの数をWaitGroupに知らせます。

wg.Add(1)
go func() {
    defer wg.Done()
    // 何らかの処理
}()


ゴルーチンの終了を待機

WaitGroupのWait()メソッドを呼び出して、全てのゴルーチンが完了するのを待機します。

wg.Wait() 


WaitGroupの注意点

正確なカウンタ操作

wg.Add(n)の呼び出しは正確でなければなりません。
起動するゴルーチンの数と一致しない場合、Wait()メソッドは永遠にブロックされるか、早すぎるタイミングでリターンする可能性があります。


Done()の呼び出しを保証する

各ゴルーチンは終了時にDone()を呼び出す必要があります。
これが呼び出されないと、Wait()は永遠に待機し続けます。deferを使用することで、ゴルーチン内でエラーが発生しても確実にDone()が呼び出されるようにすることができます。


Add()のタイミング

Add()はゴルーチンを起動する前に呼び出すのが一般的ですが、条件によってはゴルーチン内で呼び出すこともあります。
ただし、この場合はWait()が先に呼び出されるリスクを避けるために注意が必要です。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています




この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?