[Go言語]Goroutineで並列処理を学ぼう2!

前回は、Goroutineの概要とスレッドの特性、channelについて学びました。

今回も引き続き、Goroutineについて学んでいきましょう。

前回

GoroutineとBuffered Channel

Buffred Channelで、Channelに保持しておく値の数を制限できます。

上記のサンプルでは、バッファの数を「2」と指定し、「ch <- num」にてchannelに値を格納しています。

プログラムを実行してみましょう。

次に、channelに対して、3つ目の値を格納してみます。

プログラムを実行するとdeadlockが発生します。

この問題を回避するには、3つ目のデータを格納する前に、バッファからデータを取り出す必要があります。

KOUKI
KOUKI

要するに、指定したバッファ数をオーバーしなければOKです。

Channelとrangeメソッド

rangeメソッドを使うと繰り返し処理が容易に実装できます。

Channelもループ処理を行うことが可能ですが、少し注意する点があります。

上記のプログラムを実行するとどうなるでしょうか?

答えは、deadlockを引き起こします

Buffered Channelとして指定したバッファ数は「2」ですが、rangeでループを回した時に3つめのデータの取得を行おうとして、deadlockが発生するようです。

この場合は、rangeでループを回す前にchannelを閉じる必要があります。

プログラムを実行してみましょう。

closeメソッドを使うとchannelを閉じることができるので、rangeにて不必要なchannelの読み込みを行わなくなります。

このcloseメソッドは、関数を跨っても有効です。

GoroutineとProducer/Consumerパターン

Producer/Consumerパターンを学びましょう。

mainスレッドからProducer,Consumerのスレッドを複数立ち上げ、Producerの中で実行した結果をConsumerを経由して取り出します。

サンプルを以下に記述します。

実行します。

尚、consumerは、以下のようにも実装できます。

このようにすると予期せぬエラーで処理が終了しても、defer wg.Doneでgoroutineの完了を知らせることが可能です。

次回

次回も引き続き、goroutineを学びましょう。

参考

Go by Example: Goroutines