Kawaii Lab

プログラミングとかサービス開発とか

goの非同期処理について全くわからないになった

今の現場に入ってからGoのプロジェクトに関わってきたのだが、今回のスプリントで初めてgo routineに触った。

 

非常に苦戦したのがChannelだ。

Channelには値を渡すことができて、渡ってきた時点で随時値を受け取ることができる。

これにより巨大なデータも、全て受け取ってから処理ではなく、一つづつ処理できるようになるため処理速度が早くなる。

Channel.close()を行うと値が受け取れなくなるので書き忘れに気をつけよう。

 

go funcは非同期関数を作るときに使用されるのだが、単純に囲まれた中の処理を実行するだけなのでそれほど難しくはない。

 

Contextについてだが、こいつはタイムアウトの設定や非同期処理を終了させるトリガーにすることができる。

こいつ自体をインスタンス化するとChannelを返すので、非同期処理内で終了やタイムアウトの通知を受けた場合処理を終了させるといった使い方だ。

 

wait groupは非同期処理をこちらで管理できるようになる。

wg(int)でインスタンス化すると、wgがジョブを管理するようになる。

wg.done()を実行するとジョブが完了したことがつたえられていく。

wg.done()はdeferをつけて必ず実行されるようにしとくといい。

インスタンス化したときに与えた回数分wg.done()を呼ぶと全てのジョブが完了し、wg.wait()以降に記述されている処理が実行されていく寸法だ。