sync.WaitGroupの使い方

こんにちはnasustです。 goroutineの並列処理で、それら全ての終了を待つ場合は、sync.WaitGroupを使用します。

sync.WaitGroupのメソッド

sync.WaitGroupは複数のgoroutineの処理を纏めて待機する機能があります。Addメソッドでgroutineの数をカウントして、スレッド側でDoneメソッドのカウントを減らします。Waitメソッドはカウントが0になるまで待機します。

Add

func  (wg *WaitGroup) Add(delta) int

deltaの数だけ、WaitGroupのカウンータに加算します。

Done

func (wg *WaitGroup) Done

WaitGroupのカウンターを1引きます。

Wait

WaitGroupのカウンターが0になるまで待機します。

サンプル

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(sleep time.Duration) {
			defer wg.Done()

			fmt.Println("sleep: ", sleep*time.Second)
			time.Sleep(sleep * time.Second)
		}(time.Duration(i + 1))
	}
	wg.Wait()
	fmt.Println("exit wait group")
}

最後に

sync.WaitGroupを使用することで簡単にWorkerが実装できます。Go言語ではシンプルに同期できるのが素晴らしいですね。

iOS、Android、Web、APIサーバーなどのフロントエンド・バックエンドを開発するソフトウェアエンジニアです。 UI/UXが好きです。かっこいいUIやWebデザインを眺めるのが趣味です。 このブログはソフトウェア開発関係の内容を記事にしています。
web service:
GitHubQiitaTwitterはてなブログ
handle name:
nasust
real name:
hideki mori
job:
ソフトウェアエンジニア
develop:
target: ios, android, web page, single page application, api server, system service, cli tool, linux embedded device

lang: c/c++, go, swift, objective-c, java, kotlin, typescript, dart, javascript, ruby, python, php

tool: vscode, xcode, android studio, photoshop, vim, docker