記事の内容
この記事では、Go言語のgoroutineの使い方を説明します。
goroutine
スレッドを生成して並列処理を行う
上手くいかない例
スレッドを生成して並列処理を行おうとしたけど、実行されない場合。
スレッドが生成される前にプログラムが終了すると、goで指定した関数は実行されません。
sync.WaitGroupで実行終了まで待つ例
sync.WaitGroupとwg.Waitを使うことで、スレッドが実行されるまで、プログラムは終了することを待ってくれます。
そうすることで、goで指定した関数が実行されます。
wg.Add()は、並列処理の数を指定することができます。
channel
channelの基本的な使い方
channelを使うことで、関数が並行して動きます。
下記の処理を見れば、channelの処理が並行して動いていることがわかります。
対象となる関数に、「channel chan int」を渡して、「<-」というキーワードを使って、データの受け渡しをしています。
繰り返し処理の中でchannelを使う方法
繰り返し処理の中でchannelを使う場合は、処理が終わった後に、必ずcloseをしましょう。
ProducerとConsumerパターン
producerで受け取った値をconsumerで加工しています。
出力を見てみると、producerに渡した値がランダムに実行されているのが特徴的ですね。
「forの中」は順番に実行されていますが、それ以降の処理は順番になっていません。
例外処理を意識した場合は、inner関数とdeferを使って実装します。
fan-in fan-out
channelを3つ、繋げた場合の処理です。
出力結果の順番をよく確認しておきましょう。
channelとselect
今まで通りのチャネルの書き方。
チャネルの処理がブロッキングされていることがわかる。
チャネルの処理がブロッキングされない書き方。
selectとdefault
channel1とchannel2がない時には、defaultの処理が実行されます。
breakの仕方も覚えておきましょう。
sync.Mutex
一つのmapに2つのgoroutineを使って書き込むと、成功する時と失敗する時があります。
それを避けるためにsync.Mutexを使用します。
まとめ
この記事では、Go言語のgoroutineについて説明しました。
Good luck for your engineer life!