18
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Golangで簡単並列化

Last updated at Posted at 2017-02-17

はじめに

Golangを選ぶ理由として並列処理が簡単に書けるからというのもあるんじゃないかと思います。
なので今回は並列化をピックアップしました。

僕のやっている書き方なので、これが最善では無いと思いますがとりあえずご紹介。

Golangで並列化したいときはgoroutineを使いましょう

go func(){
    // 処理
}()

でもこれだけだと処理の完了とか取れないので"sync"パッケージも使いましょう。

import "sync"

つまりどういうことかと言うと

main1.go
package main

import(
    "fmt"
    "sync"
    "time"
)
func main(){
    var s, e time.Time
    s = time.Now()
    var wg sync.WaitGroup
    for i:=0; i<20; i++{
        wg.Add(1)
        go func(num int){
            defer wg.Done()
            process(num)
        }(i)
    }
    wg.Wait()
    e = time.Now()
    fmt.Printf("処理完了 : %v Seconds\n", (e.Sub(s)).Seconds())
}
func process(num int){
    fmt.Printf("%d 番目の処理開始\n", num)
    time.Sleep(1 * time.Second)
    fmt.Printf("%d 番目の処理終了\n", num)
}

main1.goは20件並列に処理しています。sync.WaitGroupで処理の完了を待っているところがポイントですね。
これで並列化できたのでメデタシメデタシ。

ですが、ちょっと待ってください、これ

    for i:=0; i<20; i++{

この20って数字が10000とかだと処理しきれなくなることある!
と気が付きます。ではどうするか。

最大並列数を決めてしまいましょう。

main2.go
package main

import(
    "fmt"
    "sync"
    "time"
)
func main(){
    var s, e time.Time
    s = time.Now()
    var wg sync.WaitGroup
    c := make(chan int, 10)
    for i:=0; i<20; i++{
        wg.Add(1)
        go func(num int){
            c<-1
            defer func(){
                <-c
                wg.Done()
            }()
            process(num)
        }(i)
    }
    wg.Wait()
    e = time.Now()
    fmt.Printf("処理完了 : %v Seconds\n", (e.Sub(s)).Seconds())
}
func process(num int){
    fmt.Printf("%d 番目の処理開始\n", num)
    time.Sleep(1 * time.Second)
    fmt.Printf("%d 番目の処理終了\n", num)
}

これの

    c := make(chan int, 10)

この部分で並列数を入れています。10を好きな数字に変えて並列数を変更しましょう。
あとはprocess関数の中身を変えるだけであなただけの処理の完成です。

それでは楽しいGolangライフをお過ごしください。

18
16
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
18
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?