kuwana-kbの開発/学習ブログ

プログラミング、クラウドインフラのWeb開発/学習ブログ

goroutineとsync.WaitGroup

goroutine と sync.WaitGroupを試してみた

goroutineは並列処理を実行するための機能で、実態はスレッド。 sync.WaitGroupはgoroutineの処理が完了するまでmainの処理を待つメソッド。

以下実際に試したサンプル

package main
 
import (
   "fmt"
   "sync"
   "time"
)
 
func normal(s string) {
   for i := 0; i < 5; i++ {
      time.Sleep(100 * time.Millisecond)
      fmt.Println(s)
   }
}
 
func goroutine(s string, wg *sync.WaitGroup) {
   //1つのwg.Add()につき、1つのwg.Done()を実行する必要がある
   defer wg.Done()
   for i := 0; i < 5; i++ {
      time.Sleep(100 * time.Millisecond)
      fmt.Println(s)
   }
}
 
func main() {
   /*
   //goによって、処理を並列実行することができる
   //goはmainの処理が完了する前に並列を開始しないといけないので、処理の前に置くこと
   //また、goroutineの処理が終わらなくとも、mainの処理が完了した時点で処理は終了する
   go goroutine("World")
   normal("Hello")
   */
 
   //goroutineの処理を実行するために、並列処理を待つための仕組みがある
   var wg sync.WaitGroup
   wg.Add(1)
   normal("hello")
   go goroutine("world", &wg)
   wg.Wait()
}