post Image
Golangで簡単並列化

はじめに

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


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。