Golang で並列処理の実行方法

概要

Golang の特徴として並列処理があります。

  • 実装方法

  • なぜ、並列処理が得意なのか

は調べたことがなかったので、改めて調べたのでまとめます。

実装方法

package main

import (
    "fmt"
)

func server(ch chan string){
    defer close(ch)
    ch <- "one"
    ch <- "two"
    ch <- "three"
}

func main()  {
    var s string

    ch := make(chan string)
    go server(ch)

    s = <- ch
    fmt.Println(s)
        // 「one」が表示

    s = <- ch
    fmt.Println(s)
        // 「two」が表示
}

上記の例では、goroutinechannelの仕組みが利用されています。

goroutine

読み方は「ゴルーチン」
並列処理を行うために宣言され、他のプログラムにおけるスレッドのような扱いになります。
使い方はgo 関数名であり、上記の例であるとgo server(ch)が該当します。

channel

並列処理を行うときに値の引き渡しを行うときに宣言されます。
宣言するときにはch := make(chan string)makeで宣言されます。
チャネルに値を代入するときには、ch <- "one"です。
チャネルからの値を変数へ代入するときには s = <- ch です。

他の実行例

例えば、下記のようにserver_sampleを追加して、goroutine で実行すると実行結果は下記のように「one」「two」「1」「2」と表示される。

package main

import (
    "fmt"
)

// 追加
func server_sample(ch chan string){
    defer close(ch)
    ch <- "1"
    ch <- "2"
    ch <- "3"
}

func server(ch chan string){
    defer close(ch)
    ch <- "one"
    ch <- "two"
    ch <- "three"
}

func main()  {
    var s string

    ch := make(chan string)
    go server(ch)

    s = <- ch
    fmt.Println(s)
         // 「one」が表示されます。
    s = <- ch
    fmt.Println(s)
         // 「two」が表示されます。

         // もう一度、chを宣言をする
    ch = make(chan string)
         // go server_sampleで並列処理をする
    go server_sample(ch)
    s = <- ch
    fmt.Println(s)
         // 「1」が表示されます。
    s = <- ch
    fmt.Println(s)
         // 「2」が表示されます。
}

Golangにおける並列処理

Golang の並列処理は上記のように goroutine で簡単に実装できるので、並列処理が得意と言われています。

並列処理のメリット

例えば、1つの処理をするときには1CPUを利用するとします。
2つ以上の処理を直列で実行するときには複数あるCPUの内、1CPUしか使うことができません。
そのため、直列で処理をする必要がないときには、並列処理を利用して処理を早く終わらせることができます。