ログイン

並列処理を使いこなせ!(Goルーチン)

 2021.7.16 ゴリラーブログ ブログ 寿司ゴリラー木村

 

 

みなさん。並列処理してますか?

私はちょこちょこしています。

 

どうも寿司ゴリラーの木村です。

 

プログラミングにおいて順次処理と並列処理はif文やfor文を理解した人が次に重要なものだと考えています。

 

それでは並列処理とは何?という解説から

なんとGo言語では、Goルーチンを使うことで簡単にかけるんだ!というお話をしていきたいと思います。

 

順次(逐次)処理と並列処理とは

プログラムの動作には、大きく分けて順次(じゅんじ)・実行と並列実行の2パターンが存在します。 

※直列処理・逐次(ちくじ)処理と呼ぶこともあります。

 

例えば、徒競走のリレーをイメージしてください。

 

順次処理とは、一人一人がバトンを持ちバトンを受け取ったタイミングで

走り出して(処理を実行して)次の走者にバトンを渡していくイメージです。

 

 

並列処理とは、徒競走のように各々が一斉に走り出しゴールに到着(処理が完了)した順に終了する流れを指します。

 

 

並列処理のメリットは、うまく使えば順次処理よりも処理時間が短くなることです。

3人が同じ距離を移動する(処理を実行する)場合でも、かかる時間は一番遅い人のタイムとなります。

それよりもタイムが速い人の処理は既に終わっているので3人の合計タイムより確実に短くなります。

 

デメリットとしては、コードの処理が複雑になってしまうこと、並列作業によりどうしてもプログラムが複雑になってしまいます。

また、「Aの結果をもとにBの処理を行う」といったアルゴリズムでは並列処理を実装することはできません。

 

プログラミングの基本は順次処理ですが、例外的に順番が影響しない処理は並列処理で実装することで処理時間を短くすることができます。

 

Goルーチン(Ro routine)について

それでは、Go言語において並列処理を実行するGoルーチンの説明です。

 

実装方法はとても簡単です。

呼び出す関数の前に、「go 」を付けるだけです。

たったそれだけで並列処理が実装できるのはGo言語の素晴らしいです。

 

サンプルコード

あれ?

上記のコードを実行してみると、go hello関数の結果が出力されていません。

 

原因は、並列処理は実行してすぐに次の処理に進むので結果を出力する(待つ)ことなくプログラムが終了してしまうからです。

 

この辺りの並列処理の制御が、プログラミングの難しい部分になってきます。

Goルーチン間のデータのやり取りには、チャネルを使います。

チャネルとは、Goルーチン間のデータをやり取りするための通路みたいなものです。

 

サンプルコード

 

チャネルを宣言し<- qの部分で結果を受け取るまで待機することで、結果がきちんと出力されます。

 

[wait group]

値をやり取りを行わず単純に処理を待つだけならWaitGorupの方が簡単に書けます。

サンプルコード:(https://play.golang.org/p/lPtQ2b8Dc_C)

順次処理では3秒かかる処理が、並列処理により3つを同時に実行することで1秒で終わることができます。

 

感想

 私もGoルーチンを完全には使いこなしていませんが、並列処理を実装することでサービスのレスポンス改善が行えます。

何より並列処理を明確に記述でき、それらの機能が手厚くサポートされているのはGo言語の良い点です。

 

最後まで読んでいただきありがとうございました。

 

次回は「えっ?Go言語の基本機能だけでAPIサーバが作れるの!?」を予定しています。

それでは良いGoライフを!

© 2021 Mountain Gorilla Co., Ltd. 

プライバシーポリシー

%d人のブロガーが「いいね」をつけました。