はじめに
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ライフをお過ごしください。