並行処理

並行処理を行わないケース

完了まで6秒かかる

package main

import (
    "log"
    "time"
)

func main() {
    log.Print(get())
    log.Print(get())
}

func get() string {
    time.Sleep(3 * time.Second)
    return "hello"
}

並行処理を使うケース

方法1

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        log.Print(get())
    }()
    wg.Add(1)
    go func() {
        defer wg.Done()
        log.Print(get())
    }()
    wg.Wait()
}

func get() string {
    time.Sleep(3 * time.Second)
    return "hello"
}

方法2

方法1をfor文でまとめると以下

package main

import (
    "log"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 2; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            log.Print(get())
        }()
    }
    wg.Wait()
}

func get() string {
    time.Sleep(3 * time.Second)
    return "hello"
}

方法3

チャンネルを使って、最大並列数を設定

package main

import (
    "log"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    c := make(chan int, 2) // 最大並列数を2に設定
    for i := 0; i < 50; i++ {
        wg.Add(1)
        go func() {
            c <- 1 // チャンネルが一杯の場合はここで待機する
            defer func() {
                wg.Done()
                <-c
            }()
            log.Print(get())
        }()
    }
    wg.Wait()
}

func get() string {
    time.Sleep(3 * time.Second)
    return "hello"
}