概要
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」が表示 }
上記の例では、goroutine
とchannel
の仕組みが利用されています。
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しか使うことができません。
そのため、直列で処理をする必要がないときには、並列処理を利用して処理を早く終わらせることができます。