2014年3月22日土曜日

Golang Cafe #21

3/15(日)に開催された「Golang Cafe #21」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、初参加のTakeshi Yamasita さん、私の4名でした。

今回は「春の Google 勉強会 2014」へ参加する道中の「フェリーでGo」という形で開催されました。フェリーで約1時間、現地のカフェで約1時間半、「Twelve Go Best Practices(Go言語の12のベストプラクティス)」の25ページから最後まで読み進めました。

自作したAPI(関数やメソッド)内での同時実行の使用は避けましょう。

 Goでは、頭に"go "を付けて関数を呼び出すだけでその関数を同時実行できる特徴がありますが、関数を「普通に呼び出す」か「同時実行で呼び出す」かは呼び出し元の都合なので、関数内で同時実行するように実装されていると、その選択が出来なくなります。 

ゴルーチンとのやりとりにはチャンネルやチャンネル構造体を使いましょう。

 本来の見出し文は「状態を管理するためにゴルーチンを使いましょう」です。ゴルーチンによる状態遷移を制御する時はチャンネルを上手く使いましょう。28ページのチャンネルは長さゼロで生成されているため、同期をとるために使用しています。

ゴルーチンが絡んだため内容もやや難しくなり、また、長めのコードを読み解いて行くのにも時間がかかったため、フェリー内での読み進めはここで一旦終了となりました。

上陸後、会場近くのコーヒー屋さんで、再開されました。

長さを指定したチャンネルを使ってゴルーチンでのメモリリークを避けましょう。

 読み解くまでに時間がかかりました...(^^;)長さゼロのチャンネルへのアクセス中にラーが発生すると、チャンネルをブロックした状態(参照したまま)になるため、処理が終わってもガベージコレクションが効かない状態になります。そのため、長さを指定したチャネルを使うことでブロック状態を回避することができるようになります。

 この辺りは、ゴルーチンやチャンネル、はたまた、ゴルーチンの考えのもとになっているCSP(Communicating Sequential Processes)の動作や考え方を勉強して行かないと厳しいなぁ、と感じました。

別個に中止用のチャンネルを用意してゴルーチンでのメモリリークを避けましょう。

 空構造体「strunct{}」は初めてみました。別途、どこからもアクセスできないように空構造体でチャンネルを生成し、それを処理を中止させる時に使用することで、長さゼロのチャンネルを使ったゴルーチン処理でエラーが発生した際のメモリリークを回避できるようになります。

腹に落とし込むまでには何回も見直す必要がありますが、今回の資料は大変ためになりました!

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回(明日...^^;)は通常通りの開催(内容は未定)のようです。

P.S.山下さんも知的好奇心を満たすことができたようです!

0 件のコメント: