LoginSignup
0
0

More than 5 years have passed since last update.

golang 並列メモ

Last updated at Posted at 2018-06-04

waitgroup.Add、waitgroup.Wait

func Afunction(num int) {
    fmt.Println(num)
    waitgroup.Done() //タスク一個終了、タスク数-1、実際.Doneは.Add(-1) 
}

func main() {
    for i := 0; i < 10; i++ {
        waitgroup.Add(1) //goroutineごとで、タスク+1、(全体10なので、10回繰り返す)
        go Afunction(i)
    }
    waitgroup.Wait() //.Wait()ここで待つ
}

例1:

func main() {

    var wg sync.WaitGroup
    wg.Add(3)
    for i := 0; i < 3; i++ {
        go func(i int) {
            defer wg.Done()
            fmt.Println("reading", i)
        }(i)
    }

    fmt.Println("ready go")
    wg.Wait()
}

違う書き方:

func main() {

    var wg sync.WaitGroup
    for i := 0; i < 3; i++ {
            wg.Add(1) //ここが違うだよ!
        go func(i int) {
            defer wg.Done()
            fmt.Println("reading", i)
        }(i)
    }

    fmt.Println("ready go")
    wg.Wait()
}
//結果:
ready go
reading 0
reading 1
reading 2

例2:

func main() {

    var wg sync.WaitGroup
    wg.Add(1) 

    go func() {
        fmt.Println("wait1 enter")
        wg.Wait()
        fmt.Println("wait1 exit")
    }()

    go func() {
        fmt.Println("wait2 enter")
        wg.Wait()
        fmt.Println("wait2 exit")
    }()

    go func() {
        fmt.Println("wait3 enter")
        wg.Wait()
        fmt.Println("wait3 exit")
    }()

    go func() {
        fmt.Println("done")
        wg.Add(-1)
    }()

    wg.Wait() 
    time.Sleep(time.Second)
    fmt.Println("main exit")
}
//出力1
wait3 enter
wait2 enter
wait1 enter
done
wait1 exit
wait3 exit
wait2 exit

//出力2
done
wait1 enter
wait1 exit
wait2 enter
wait2 exit
wait3 enter
wait3 exit
main exit
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0